在namedtuple中typename的相关性

时间:2014-03-31 13:01:39

标签: python python-3.x typename namedtuple

from collections import namedtuple

Point=namedtupe('whatsmypurpose',['x','y'])
p=Point(11,22)
print(p)

输出:

whatsmypurpose(x=11,y=22)

'whatsmypurpose'的相关性/用途是什么?

3 个答案:

答案 0 :(得分:11)

namedtuple()tuple子类的工厂函数。这里,'whatsmypurpose'是类型名称。创建命名元组时,会在内部创建具有此名称(whatsmypurpose)的类。

你可以通过使用像:

这样的详细参数来注意这一点
Point=namedtuple('whatsmypurpose',['x','y'], verbose=True)

您也可以尝试type(p)来验证这一点。

答案 1 :(得分:7)

'whatsmypurpose'为新子类赋予其类型名称。来自文档:

  

collections.namedtuple( typename ,field_names,verbose = False,rename = False)
  返回名为 typename 的新元组子类。

以下是一个例子:

>>> from collections import namedtuple
>>> Foo = namedtuple('Foo', ['a', 'b'])
>>> type(Foo)
<class 'type'>
>>> a = Foo(a = 1, b = 2)
>>> a
Foo(a=1, b=2)
>>> Foo = namedtuple('whatsmypurpose', ['a', 'b'])
>>> a = Foo(a = 1, b = 2)
>>> a
whatsmypurpose(a=1, b=2)
>>> 

verbose参数设置为True,您可以查看完整的whatsmypurpose类定义。

>>> Foo = namedtuple('whatsmypurpose', ['a', 'b'], verbose=True)
from builtins import property as _property, tuple as _tuple
from operator import itemgetter as _itemgetter
from collections import OrderedDict

class whatsmypurpose(tuple):
    'whatsmypurpose(a, b)'

    __slots__ = ()

    _fields = ('a', 'b')

    def __new__(_cls, a, b):
        'Create new instance of whatsmypurpose(a, b)'
        return _tuple.__new__(_cls, (a, b))

    @classmethod
    def _make(cls, iterable, new=tuple.__new__, len=len):
        'Make a new whatsmypurpose object from a sequence or iterable'
        result = new(cls, iterable)
        if len(result) != 2:
            raise TypeError('Expected 2 arguments, got %d' % len(result))
        return result

    def _replace(_self, **kwds):
        'Return a new whatsmypurpose object replacing specified fields with new values'
        result = _self._make(map(kwds.pop, ('a', 'b'), _self))
        if kwds:
            raise ValueError('Got unexpected field names: %r' % list(kwds))
        return result

    def __repr__(self):
        'Return a nicely formatted representation string'
        return self.__class__.__name__ + '(a=%r, b=%r)' % self

    def _asdict(self):
        'Return a new OrderedDict which maps field names to their values.'
        return OrderedDict(zip(self._fields, self))

    def __getnewargs__(self):
        'Return self as a plain tuple.  Used by copy and pickle.'
        return tuple(self)

    a = _property(_itemgetter(0), doc='Alias for field number 0')

    b = _property(_itemgetter(1), doc='Alias for field number 1')

答案 2 :(得分:0)

考虑:

class MyClass(tuple):
   pass

这将创建一个 type ,它是一个元组子类,并且具有名称MyClass.__name__ == "MyClass"namedtuple类型工厂,它还会创建元组子类,但是在此功能性API中,您必须显式传递名称。

当您将返回的类型分配给其他名称时:

Point = namedtuple('whatsmypurpose',['x','y'])

这类似于这样做:

class whatsmypurpose(tuple):
    ... # extra stuff here to setup slots, field names, etc

Point = whatsmypurpose
del whatsmypurpose

在两种情况下,您都只是为该类型使用了不同的别名。

通常,您将分配与用于类型名称的名称相同的名称。如果您担心重复的字符串不是DRY,那么可以在typing.NamedTuple中使用声明性API,而不要在collections中使用该功能性API。 然后,您可能会因为需要注释类型而烦恼。