为什么 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'>
。但是你怎么知道哪个是你的新Card
class,哪个是你的新PokerHands
class?
为什么我们需要为 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'>
。但是你怎么知道哪个是你的新Card
class,哪个是你的新PokerHands
class?