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

namedtuple field names: single string or sequence?

Python 允许在 namedtuple 的声明中提供 field_names 作为字符串序列或作为单个字符串,每个名称由空格 and/or 逗号分隔。

根据官方文档,Python 2 中的首选方式似乎是按顺序提供名称:

field_names are a sequence of strings such as ['x', 'y']. Alternatively, field_names can be a single string with each fieldname separated by whitespace and/or commas, for example 'x y' or 'x, y'.

而在 Python 3 中,首选项更改为单字符串版本:

field_names are a single string with each fieldname separated by whitespace and/or commas, for example 'x y' or 'x, y'. Alternatively, field_names can be a sequence of strings such as ['x', 'y'].

这背后有什么原因吗?

乍一看,我会说单字符串版本效率较低,因为它需要拆分输入。该序列对我来说似乎也更具可读性。哪个效率更高?

是的,提供 str 涉及 .replace.split,然后再将其内容映射到 strs,see source:

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

这显然比您提供列表要花费更多的时间。虽然,这应该 永远不会 成为性能瓶颈,但它仅在生成 class; 的 namedtuple 的初始调用期间执行;随后的调用不必对它做任何事情。总之,这里不用担心性能问题。

我可以给出一个支持 a b 方法的论点:它暗示字段名称中不允许有空格。 [a,b] 方式导致 reader 相信空格是允许的,这是不正确的。更糟糕的是,官方namedtuple documentation并没有直接说禁止使用空格。它只说:

"Any valid Python identifier may be used for a fieldname (...)".