从函数返回namedtuple

时间:2017-01-20 14:38:25

标签: python python-2.7 function namedtuple

我只想了解为什么会得到以下结果

来自以下代码

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

打印结果为:

1: <class '__main__.httpStatus'>

,而

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变量会给出值而不是变量名吗?

2 个答案:

答案 0 :(得分:2)

在第一个函数中,您忽略创建的实例,然后返回int x = 0xFF; unsigned char *test = (unsigned char *)&x; if(test[sizeof(int)-1] == 0xFF) /* big-endian */ if(test[sizeof(int)-1] == 0x00) /* little-endian */ 类。您可以直接打印该类而不使用相同结果的函数:

namedtuple

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

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

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

请注意,这与命名元组无关。这将发生在任何类;你正在返回类对象本身。

答案 1 :(得分:2)

因为在第一种情况下,你不能通过调用httpStatus对结果实例做任何事情,然后只返回作为参数传递的namedtuple类。

而在第二天,b 已分配 httpStatus的实例,该实例是使用

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

然后返回。

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

return httpStatus(Code=req.status_code,Desc=req.reason)
在第一种情况下

,而不是没有返回语句赋值的无用调用。