namedtuple字段名称:单个字符串还是序列?

问题描述:

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

是,提供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