Python命名规范 - 命名元组(namedtuples)

12

我是Python的新手,一直在阅读在线文档并(尝试)遵循PEP 0008以获得良好的Python代码风格。 在学习关于re库的内容时,我在官方Python 文档中发现了一个代码段,感到很好奇:

import collections

Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column'])

我不明白为什么 Token 变量的首字母要大写;我已经阅读了 PEP 0008,没有找到相关参考。如果它不是常量(就我所知),那么它不应该改为 tokenTOKEN 吗?

7
因为它是一个类 - namedtuple 是一个类工厂。 - jonrsharpe
2个回答

16
在你提供的代码片段中,Token是一个命名元组,绝对不是常量。它不遵循其他变量名称的命名风格,只是强调它是一个类工厂函数。 如果将其写为token,则不会出现来自PEP 0008样式检查器(例如PyCharm)的警告,但我认为这不是一个好习惯,因为这种方式不能将其区分为类工厂名称。
因此,命名元组属于PEP 0008中的类名。遗憾的是它没有被更明确地说明。 除了你提到的编写标记生成器的例子外,这也可以在collections.namedtuple文档示例中看到:
Point = namedtuple('Point', ['x', 'y'])
Point3D = namedtuple('Point3D', Point._fields + ('z',))
Book = namedtuple('Book', ['id', 'title', 'authors'])

Anti Haapala的回答比我先到了。非常好的回答。 - Yannis
你的回答更好 :d - Antti Haapala -- Слава Україні
@Yannis,值得注意的是,从Class names link中包含的信息应该是Class names通常使用CapWords约定,因此命名元组。 - boardtc

8
关键在于collections.namedtuple。正如文档所述,

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

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

没有PEP 8违规;Token是用户定义的类,其名称应大写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接