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
,然后再将其内容映射到 str
s,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 (...)".
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
,然后再将其内容映射到 str
s,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 (...)".