2016-04-02 120 views
8

我是Python新手,我一直在阅读在线文档和(试图)遵循PEP 0008以获得良好的Python代码风格。 我好奇的代码段我在官方Python发现docs在研究关于重新库:Python命名约定 - namedtuples

import collections 

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

我不明白为什么Token变量命名为与第一个字母大写;我已经通读了PEP 0008,对于我所看到的没有任何参考。如果它不是token改为或TOKEN如果它是一个常数(我知道这是不是一个常数)?

+5

因为它是一类 - 'namedtuple'是一个类工厂。 – jonrsharpe

回答

9

在您提供的代码段中,Tokennamed tuple,绝对不是常量。它不遵循其他变量名称命名风格,只强调它是类工厂函数。 如果您将其编写为token,PEP 0008风格检查器(例如PyJharm)将不会发生警告,但我认为这不是好的做法,因为它不会将其区分为类工厂名称。

因此,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']) 
+0

反Haapala的答案打败了我。很好的答案。 – Yannis

+0

那么你的答案是更好的:d –

+0

两个很好的答案,我真的很喜欢链接到PEP 0008.谢谢 – Karim

8

这里的关键是collections.namedtuple。由于文件说,

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

返回一个新tuple命名typename。新的子类用于创建类似tuple的对象,该对象具有可通过属性查找访问的字段以及可索引和可​​迭代的对象。子类的实例也有一个有用的文档字符串(带有typename和field_names)和一个有帮助的__repr__()方法,该方法以name=value格式列出元组内容。

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