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

Why does namedtuple in python need a name?

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

import collections

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

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

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

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

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

collections.namedtuple: Returns a new tuple subclass named typename...

namedtuple returns 元组类型的子class,而不是元组实例。

name参数指定新子class的class名称,就像定义一个常规的Pythonclass并给它一样姓名:

>>> 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,一个 工厂函数 returns 一个元组的子class。

当你像这样创建命名元组时

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

您正在创建一个新的 class(它是 tuple 的子class)

>>> Card
<class '__main__.Card'>

所以为了清楚起见,最好专门命名 class,因为它有自己的特定属性(__init__ 有两个参数,第一个成为实例的 rank 属性,第二个变成它的 suit 论点)。

namedtuple 作者本可以为所有这些 class 使用相同的名称,因此它看起来像 <class 'collections.NamedTuple'>。但是你怎么知道哪个是你的新Cardclass,哪个是你的新PokerHandsclass?