为什么python中的namedtuple需要一个名字?

时间:2017-03-09 09:42:27

标签: python data-structures namedtuple

为什么我们需要提及Card的名称namedtuple,如下所示?

import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])

我认为一个简单的Card = collections.namedtuple(['rank', 'suit'])实际上可以产生同样的效果吗?

例如,我可以在dict中获得相同的信息,如:

card = dict({'rank': 'A', 'suit': 'spade'})

2 个答案:

答案 0 :(得分:5)

不,这不会产生同样的效果。

  

collections.namedtuple:   返回名为typename ...

的新元组子类

namedtuple返回元组类型的子类,而不是元组实例。

name参数指定新子类的类名,就像定义常规Python类并为其命名一样:

>>> from collections import namedtuple
>>> namedtuple('Card', ['rank', 'suit'], verbose=True)
class Card(tuple):
    'Card(rank, suit)'

    __slots__ = ()

    _fields = ('rank', 'suit')

    def __new__(_cls, rank, suit):
        'Create new instance of Card(rank, suit)'
        return _tuple.__new__(_cls, (rank, suit))
    ...

快速类型检查清除了所有疑问:

>>> type(_), issubclass(_, tuple)
(<class 'type'>, True) 

那么,你有namedtuple,一个工厂函数,它返回一个元组的子类。

答案 1 :(得分:1)

当您创建这样的命名元组时

from collections import namedtuple
Card = namedtuple('Card', ['rank', 'suit'])

您正在创建一个新类(它是tuple

的子类
>>> Card
<class '__main__.Card'>

为了清楚起见,专门命名类是更好的,因为它具有自己的特定属性(__init__有两个参数,第一个成为实例&#39; s {{1} }属性,第二个变成它的rank参数。)

suit作者可能为所有这些类使用了相同的名称,因此它看起来像namedtuple。但是,你怎么知道哪一个是你的新<class 'collections.NamedTuple'>课程,哪一个是你的新Card课程?