Должны ли 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