2015-05-29 31 views
2

一個namedtuple當collections.namedtuple()構造函數的第一個參數,第一個參數是你要創建的類型的名稱,但據我可以說,除了診斷信息之外,它是無關緊要的。爲什麼你必須提供類型名作爲建立在Python

from collections import namedtuple 
Point = namedtuple('Point', 'x y') 
p = Point(1,2) # works fine, creates Point(x=1, y=2) 

Point = namedtuple('blah', 'x y') 
p = Point(2,3) # works fine, creates blah(x=1,y=2) 

這只是一個必要的項目,程序員應該用於診斷目的基本保持一致,因爲那裏會是沒有辦法Python來學習你分配namedtuple給變量的名字嗎?似乎很容易出錯,但我可以看到它是如何有必要的。只是想知道是否有任何其他原因或不匹配這兩個名字的影響。

回答

4

命名元組中的一種,骯髒的方式來實現。有一個模板字符串有幾個佔位符,並且當您調用namedtuple()時發生的情況實際上是那些佔位符被參數替換,模板爲eval'd。這個實現看起來很髒(因爲它使用了eval),但是非常簡單而且功能強大。

缺點是有一類名稱的實際需要,因爲第一線之一居然是這樣的:class {typename}(tuple):。所以你確實需要指定一個類型名稱才能工作。

至於這個名字的價值,也沒有多大意義,但正如你所說的自己,用於調試的目的,是要選擇你還可以使用用於保存類型變量相同的名稱是非常有用的。否則,整個事情將不會有太大的不同:

class CustomType: 
    … 

# assign a new name, and never talk about CustomType again 
NewName = CustomType 
+2

「再也不談論CustomType」。或者,就此而言,'del CustomType'。很容易忘記Python中的def和class在它們創建的對象的名稱(即函數或類)和它們分配給它的屬性/變量的名稱之間沒有建立任何固有連接。他們使用兩個相同的名稱,'collections.namedtuple'不能這樣做,因爲它只是一個函數調用,而不是內置的語言,所以它不能「看到」賦值。事實上,有可能不是一個任務,你可以只寫'namedtuple(「富」,「X」)(1)' –

+1

這也是值得比較'namedtuple'到type'的'3個參數的形式,這也需要作爲第一個參數創建的類的名稱。 ('namedtuple'可能會被重新實現爲使用'type',事實上,而不是執行一個類聲明。) – chepner

+0

有人可能會認爲使用'type'會更糟糕,因爲無法創建['' _source'](https://docs.python.org/3/library/collections.html#collections.somenamedtuple._source)作爲namedtuple。 – Navith

相關問題