我是Python新手,我一直在阅读在线文档和(尝试)跟随PEP 0008以获得良好的Python代码风格。 我很好奇我在研究re库时在官方Python docs中找到的代码段:
import collections
Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column'])
我无法理解为什么 Token
变量的首字母大写;我已经阅读了PEP 0008并且没有参考我所看到的内容。如果它不是 token
,或者 TOKEN
,如果它是一个常量(我知道它不是)吗?
答案 0 :(得分:11)
在您提供的代码段中,Token
是named tuple,绝对不是常量。它不遵循其他变量名称命名样式,只强调它是类工厂函数这一事实。
如果你把它写成 token
,PEP 0008样式检查器(例如 PyCharm )就不会发出警告但我认为这不是好习惯它不会将它区分为类工厂名称。
因此, namedtuples 属于PEP 0008中的Class names。太糟糕了没有明确说明。 除了您在writing a tokenizer中提到的示例之外,这也可以在collections.namedtuple docs示例中看到:
Point = namedtuple('Point', ['x', 'y'])
Point3D = namedtuple('Point3D', Point._fields + ('z',))
Book = namedtuple('Book', ['id', 'title', 'authors'])
答案 1 :(得分:8)
这里的关键是collections.namedtuple
。正如文档所说,
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回名为
tuple
的新typename
子类。新的子类用于创建tuple
- 类似于具有可通过属性查找访问的字段以及可索引和可迭代的对象。子类的实例还有一个有用的docstring(带有typename和field_names)和一个有用的__repr__()
方法,它以name=value
格式列出元组内容。
没有PEP 8违规; Token
是一个用户定义的类,它的名称应该大写。