Должны ли namedtuples следовать постоянным соглашениям имен в python?
Я написал небольшой модуль python, где я использую пару названий, чтобы передавать информацию, потому что я нахожу их очень выразительными. Я рассмотрел эти типы и назвал их после соглашения PEP8 для имен классов (CamelCased). Однако pylint видит строку:
PersonData = collections.namedtuple('PersonData', 'name surname age')
в глобальной области модуля и идет: Недопустимое имя константы 'PersonData'.
Я неправильно использую namedtuples? Какая питонская рекомендация? Я могу только думать о подавлении предупреждения, переименовании структуры в PERSON_DATA или создании полноценного класса. Обратите внимание, что в моем случае было бы нецелесообразно использовать методы.
Если ответ заключается в подавлении предупреждения. Не будет ли это повторяющейся проблемой с pylint vs с именами кортежей?
(используя pylint-0.26.0, python-2.7.4)
Ответы
Ответ 1
Эта проблема была решена в новых версиях pylint.
Моя система выбирала версию из репозиториев ubuntu (13.04) (pylint-0.26.0).
Используя virtualenv
, я мог бы установить pylint-1.0.0, который распознает именованные кортежи и будет фактически применять тот же формат, что и классы.
Обратите внимание, что он не подберет его, если вы выполняете строковые манипуляции в строке полей. Например:
PersonData = collections.namedtuple('PersonData', 'name ' + 'surname age')
все равно приведет к тому, что pylint-1.0.0 выплюнет код ошибки для недопустимого имени константы. В этом случае единственным обходным решением является отключить предупреждение в соответствии с предложением Martijn Pieters.
Ответ 2
Здесь вы можете игнорировать pylint
, вы правильно используете соглашение об именах верблюдов.
Вы можете подавить предупреждение:
PersonData = collections.namedtuple('PersonData', 'name surname age') # pylint: disable-msg=C0103
namedtuple
- это класс factory, поэтому используйте соглашения об именах для класса.
Ответ 3
Это было исправлено в pylint-1.0.0
(см. Pylint Changelog):
Для назначения имени верхнего уровня, имя класса regex будет использоваться, если pylint может обнаружить, что значение в правой части является классом (например, collection.namedtuple()).
Обратите внимание, что namedtuple должен быть определен на toplevel, если он определен, например. внутри функции pylint все равно выдаст предупреждение invalid-name
.
Ответ 4
в таком случае pylint должен определить, что имя назначено классу, а имя класса regexp.
Пожалуйста, отправьте билет на http://bitbucket.org/logilab/pylint