Python命名约定 - namedtuples

11 python pep8 naming-conventions namedtuple python-3.x

我是Python的新手,我一直在阅读在线文档和(尝试)遵循PEP 0008以获得良好的Python代码风格.我很好奇我在研究re库时在官方Python 文档中找到的代码段:

import collections

Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column'])
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么Token变量以首字母大写命名; 我已经阅读了PEP 0008并且没有参考我所看到的内容.它应该token不是或者TOKEN它是一个常数(我知道它不是)吗?

Yan*_*nis 11

在您提供的代码段中,Token是一个命名元组,绝对不是常量.它不遵循其他变量名称命名样式,只强调它是类工厂函数的事实.如果你把它写成PEP 0008样式检查器(比如PyCharm)就不会发出警告,token但我认为这不是好习惯,因为这样它就不会将它区分为类工厂名称.

所以,namedtuples归入类名在PEP 0008太糟糕了,没有说明更明确.除了你提到的编写tokenizer的例子,这也可以在collections.namedtuple文档示例中看到:

Point = namedtuple('Point', ['x', 'y'])
Point3D = namedtuple('Point3D', Point._fields + ('z',))
Book = namedtuple('Book', ['id', 'title', 'authors'])
Run Code Online (Sandbox Code Playgroud)


Ant*_*ala 7

这里的关键是collections.namedtuple.正如文件所说,

collections.namedtuple(typename, field_names, verbose=False, rename=False)

返回一个名为的新tuple 子类typename.新子类用于创建类似tuple对象,这些对象具有可通过属性查找访问的字段以及可索引和可​​迭代的字段.子类的实例也有一个有用的docstring(带有typename和field_names)和一个有用的__repr__()方法,它以一种name=value格式列出元组内容.

没有违反PEP 8的规定; Token是一个用户定义的类,它的名称应该大写.