【问题标题】:Why does namedtuple in python need a name?为什么python中的namedtuple需要一个名字?
【发布时间】:2017-07-30 05:27:10
【问题描述】:

为什么我们需要在下面提到namedtuple 的名称Card

import collections

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

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

例如,我可以在 dict 中包含相同的信息,例如:

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

【问题讨论】:

    标签: python python-3.x data-structures namedtuple


    【解决方案1】:

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

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

    的新元组 subclass

    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,一个工厂函数,它返回一个元组的子类。

    【讨论】:

    • 如何实例化一个匿名类?请注意,a = {} 通过字面量创建字典 instance,而不是字典子类
    • 只是为了补充一个很好的答案:实际上,子类的创建允许.__class__.__class__.__name__ 之类的东西完美地工作并按预期工作。也是__repr__ 的一个非常好的免费实现。
    • @Nishant namedtuple 是一个函数,它返回一个新的元组子类。 &lt;function namedtuple at 0x7f3b4ae7c500&gt;
    • @Nishant lambda 函数是匿名函数。 tuple 的名字是元组(类名)。 namedtuple 的名称是返回的新类的名称。就是设计理念,不然就不叫namedtuple
    • 一个更实际的问题是:使用“垃圾”名称有什么害处吗? 'int' 呢?甚至是空字符串''?例如,Card = namedtuple('int', ['rank', 'suit'], verbose=True)
    【解决方案2】:

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

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

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

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

    所以为了清楚起见,最好给类具体命名,因为它有自己的特定属性(__init__ 有两个参数,第一个成为实例的rank 属性,第二个成为它的suit 参数)。

    namedtuple 作者可以为所有这些类使用相同的名称,所以它看起来像&lt;class 'collections.NamedTuple'&gt;。但是你怎么知道哪一个是你的新Card 类,哪一个是你的新PokerHands 类?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2019-04-23
      • 2013-12-03
      • 1970-01-01
      • 2018-05-04
      • 2014-11-07
      • 2015-06-26
      相关资源
      最近更新 更多