2016-12-01 51 views
1

Python允許在namedtuple的聲明中提供field_names,作爲字符串序列或作爲單個字符串,每個名稱用空格和/或逗號分隔。namedtuple字段名稱:單個字符串還是序列?

根據官方的文檔,似乎在Python 2的首選方法是提供的名稱爲序列:

FIELD_NAMES都是字符串如序列[「X」,「Y」] 。 或者,field_names可以是單個字符串,每個字段名稱由用空格和/或逗號分隔的字段名稱 (例如'x y'或'x,y')分隔。

而在Python 3偏好改變爲單個串版本:

FIELD_NAMES是一個字符串與由 空格和/或逗號分隔的每個字段名,例如「XY」或「X, Y」。 或者,field_names可以是一串字符串,如['x','y']。

是否有背後的原因?

乍一看,我會說單字符串版本效率不高,因爲它需要分割輸入。序列似乎也更易讀。哪一個更有效?

+1

通常namedtuple類型在啓動時創建一次,所以效率在這裏不應該是一個大問題。使用你認爲最具可讀性的內容。 – zstewart

+0

@zstewart:那麼,爲什麼他們花時間在Python 3的文檔中進行重述? – Pintun

+0

也許他們認爲它更具可讀性,或許這不是一個有意的決定,我不知道。但是由於namedtuple通常用作頂級單執行類型聲明,類似於'class',所以這個字符串解析的效率是非常不相關的。 – zstewart

回答

2

是,提供str涉及.replace.split其內容映射到str S,see source前:

if isinstance(field_names, str): 
    field_names = field_names.replace(',', ' ').split() 
field_names = list(map(str, field_names)) 

這顯然需要更多的時間比,如果你提供的列表。雖然,這應該是永不是一個性能瓶頸,它只是在初始調用生成類的namedtuple時執行;隨之而來的呼叫不必對此做任何事情。總之,不要擔心這裏的表現。

+0

但是他們爲什麼要重述?這背後有一個原因。我開始認爲改編是由於編輯只是考慮更多的「pythonic」單字符串版本。也許是因爲它避免了函數調用中的列表的嵌套構造。 – Pintun

+0

我似乎無法找到關於此問題的bug跟蹤器的任何特定問題。我懷疑是否有某種原因(如表現)導致它發生變化,這可能只是歸結爲某些人的個人偏好(就像這一層面上的事情一樣)。 @Pintun –

+2

歷史的觀點有點令人驚訝,Python 2.6擁有[「單一字符串」版本](http://svn.python.org/view/doctools/trunk/Doc-26/library/collections.rst?revision = 56662&視圖=標記&pathrev = 57058#l371),然後[ 「次要DOC清理」](https://github.com/python/cpython/commit/7be6326e09f2062315f995a18ab54baedfd0c0ff)的順序改變了只是用於Python 2. – wrwrwr

相關問題