namedtuple return和它的typename参数有什么区别?

时间:2016-01-23 10:14:18

标签: python

Python文档说:

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
Returns a new tuple subclass named typename. 

它给出了一个例子

>>>Point = namedtuple('Point', ...

在我可以找到的所有示例中,namedtuple和参数typename的返回拼写相同。

试验,似乎论证无关紧要:

>>>Class = collections.namedtuple('Junk', 'field')
>>>obj = Class(field=1)
>>>print obj.field
1

区别是什么? typename参数如何重要?

1 个答案:

答案 0 :(得分:9)

执行以下代码时:

Bar = collections.namedtuple('Foo', 'field')
你是:

  1. 创建名为Foo;
  2. 的新类型
  3. 将该类型分配给名为Bar的变量。
  4. 该代码相当于:

    class Foo:
        ...
    
    Bar = Foo
    del Foo
    

    即使您将班级分配给名称不同的变量,Foo仍然是“官方”名称,即:Bar.__name__仍然是'Foo'

    打印课程或实例时,您会看到不同之处:

    >>> Bar = collections.namedtuple('Foo', 'field')
    >>> obj = Bar(field=1)
    >>> obj
    Foo(field=1)
    

    您可能会问为什么namedtuple需要类型名称,因为它是多余的(按照惯例)。好吧,namedtuple在分配变量之前构建类型,因此无法推断出类型名称,需要明确告知它。 (或者更好:它可以通过检查调用者的代码来推断出名称,但这种情况很糟糕,对非常规情况不起作用。)