2015-03-31 53 views
6

在阅读fmark的问题的答案What are "named tuples" in Python?我看到,鉴于那里的例子有相同的名称和参考,即这个词Point在下面的语句中出现两次:
命名元组的名称和引用可以不同吗?

Point = namedtuple('Point', 'x y')

所以我去了原始参考:
https://docs.python.org/2/library/collections.html#collections.namedtuple
在这里,我也发现了两个例子:

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 
Color = namedtuple('Color', 'red green blue') 

理想情况下,Python中不重复单词。比如整条生产线(为的Point例子)可以被替代如下:

namedtuple('Point', 'x y') 

OR

Point = namedtuple('x y') 

当然,这是假设命名元组必须具有相同的名称和参考。所以我的问题是:什么时候它是可取的(如果完全允许的话)一个命名的元组应该有不同的名称和引用?我还没有碰到一个例子。

+1

'namedtuple('Point'...)'创建一个名为'Point'的类,但是不将其分配给某个标识符,您只能使用它一次。 'point1 = namedtuple('Point','x y')(1,0)','type(point1)'是'。使用与类名相匹配的标识符是很方便的,但它不是必需的,例如, 'Vertex = namedtuple('Point'...)'。一个类只是python中的另一个对象,每当你为类名指定一个不同的标识符时,你就会使用一个不同的名字,例如'class Point:... Vertex = Point' – AChampion 2015-03-31 02:04:57

+2

在我看来,'namedtuple'模块是一个可怕的混乱,本来应该是用metaclasses编写的。它仍然不完全清楚[为什么它不是](http://stackoverflow.com/questions/28184531),但如果它已经,你可以选择使用名称元组的类定义,指定一个元类,不需要重复类名。 – 2015-03-31 03:41:21

回答

10

你可以做到这一点,它只会惹恼你。

In [1]: import collections 

In [2]: Point = collections.namedtuple('Rectangle', 'x y') 

In [3]: Point(1, 2) 
Out[3]: Rectangle(x=1, y=2) 

这是令人困惑的,除非你有很好的理由,否则不要这样做。

发生这种情况的原因是因为namedtuple()只是一个函数,它没有关于它如何用作声明的特殊知识。在使用宏的语言中,namedtuple()将是一个扩展为声明的宏。因此,不必在宏系统上添加或者为名称遍历调用堆栈,而必须指定两次名称。

所以它是Python的“疣”之一,或设计的妥协,取决于你对它的感觉。

+1

更具体地说:它发生的原因是'namedtuple'是使用'exec'和字符串格式化编写的,而不是使用元类(它具有绑定到提供的元类实例名称的第一个'name'参数)。为什么是这样? [谁知道。](http://stackoverflow.com/questions/28184531/why-doesnt-the-namedtuple-module-use-a-metaclass-to-create-nt-class-objects) – 2015-03-31 03:37:10

+0

尽管公平,当使用元类作为类工厂时(例如'type('name',(object,),{})''),您仍然需要重复类名。 – 2015-03-31 03:44:00

相关问题