2016-04-02 5 views
8

Я новичок в Python, и я читал как онлайн-документацию, так и (пытается) следовать PEP 0008, чтобы иметь хороший стиль кода Python. мне любопытно сегмент кода я нашел в официальном Python docs при изучении библиотеки Re:Соглашение об именах Python - namedtuples

import collections 

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

Я не могу понять, почему переменная Token называется с первой заглавной буквой; Я прочитал PEP 0008, и для него нет ссылок на то, что я видел. Должно ли это быть не token или TOKEN Если бы это была постоянная (что для всех, кого я знаю, это не так)?

+5

Потому что класс - 'namedtuple' класс фабрики. – jonrsharpe

ответ

9

В приведенном кодовом сегменте Token - это номер named tuple, определенно не постоянный. Он не следует за именованием имен других имен переменных, чтобы подчеркнуть тот факт, что это класс заводской функции. Предупреждения не будет происходить из PEP 0008 стиля проверки (например, PyCharm, например), если записать его в виде token, но я думаю, что это не является хорошей практикой, так как таким образом он не отличает его как имя класса фабрики.

Итак, namedtuples подпадают под Class names в PEP 0008. Слишком плохо не указано более явно. Помимо примера вы упомянули для writing a tokenizer, это также можно увидеть в collections.namedtuple docs примерах:

Point = namedtuple('Point', ['x', 'y']) 
Point3D = namedtuple('Point3D', Point._fields + ('z',)) 
Book = namedtuple('Book', ['id', 'title', 'authors']) 
+0

Ответ Анта Хапалы избил меня. Отличный ответ. – Yannis

+0

Ну ваш ответ лучше: d –

+0

Оба отличных ответа, мне очень понравилась ссылка на PEP 0008. Спасибо – Karim

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 - пользовательский класс, и его имя капитализируется так, как должно.

 Смежные вопросы

  • Нет связанных вопросов^_^