从函数返回namedtuple

2024-10-01 11:21:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想知道为什么我会得到以下结果

从下面的代码

def sendHTTP(httpStatus):   
    status_code = 400
    reason = "Unauthorized"
    httpStatus(Code=req.status_code,Desc=req.reason)
    return httpStatus

if __name__ == '__main__':
    httpStatus = namedtuple('httpStatus','Code Desc')
    http_results = sendHTTP(httpStatus)
    print "1:",http_results

打印结果:

^{pr2}$

同时

def sendHTTP(httpStatus):

    status_code = 400
    reason = "Unauthorized"
    b = httpStatus(Code=req.status_code,Desc=req.reason)
    return b

if __name__ == '__main__':
    httpStatus = namedtuple('httpStatus','Code Desc')
    http_results = sendHTTP(httpStatus)
    print "1:",http_results

打印结果为:

1: httpStatus(Code=401, Desc='Unauthorized')

有人能解释一下为什么添加b变量会给出值而不是变量名?在


Tags: namehttpreturnifdefstatuscodereq
2条回答

在第一个函数中,忽略创建的实例,然后返回namedtuple类。您可以直接打印类而不使用函数获得相同的结果:

>>> from collections import namedtuple
>>> httpStatus = namedtuple('httpStatus','Code Desc')
>>> print httpStatus
<class '__main__.httpStatus'>

在第二个函数中,将创建的实例分配给变量,然后返回变量引用的任何内容(即创建的实例)。在

您可以放弃变量,直接返回实例:

^{pr2}$

请注意,这与命名元组无关。对于任何类都会发生这种情况;您返回的是类对象本身。在

因为在第一种情况下,您不会对来自httpStatus调用的结果实例执行任何操作,然后只返回作为参数传递的namedtuple类。在

而在第二个例子中,b分配给了{}的实例,它是用

b = httpStatus(Code=req.status_code,Desc=req.reason)

然后返回。在

如果你想在两种情况下都有相同的(正确的)行为,你应该直接

^{pr2}$

在第一种情况下,不要使用没有return语句赋值的无用调用。在

相关问题 更多 >