2015-03-31 116 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

相關問題