Должны ли namedtuples следовать соглашениям об именах констант в python?

Я написал небольшой модуль Python, в котором я использую пару namedtuples для передачи информации, потому что я нахожу их очень выразительными. Я рассмотрел эти типы и назвал их в соответствии с соглашением PEP8 для имен классов (CamelCased). Однако pylint видит строку:

PersonData = collections.namedtuple('PersonData', 'name surname age')

в глобальной области модуля и выходит: Недопустимое имя константы «PersonData».

Я неправильно использую namedtuples? Какова питоническая рекомендация? Я могу думать только о том, чтобы подавить предупреждение, переименовать структуру в PERSON_DATA или сделать ее полноценным классом. Обратите внимание, что в моем случае не имеет смысла иметь методы.

Если ответ состоит в том, чтобы подавить предупреждение. Не будет ли это повторяющейся проблемой с pylint и именованными кортежами?

(с использованием pylint-0.26.0, python-2.7.4)


person Luis    schedule 14.11.2013    source источник


Ответы (4)


Эта проблема была решена в новых версиях pylint.

Моя система выбирала версию из репозиториев Ubuntu (13.04) (pylint-0.26.0). Используя virtualenv, я мог бы pip установить pylint-1.0.0, который распознает именованные кортежи и фактически будет использовать тот же формат, что и классы.

Обратите внимание, что он не подберет его, если вы выполняете манипуляции со строками в строке полей. Например:

PersonData = collections.namedtuple('PersonData', 'name ' + 'surname age')

по-прежнему будет заставлять pylint-1.0.0 выдавать код ошибки для недопустимого имени константы. В этом случае единственным обходным решением является отключение предупреждения в соответствии с предложением Martijn Pieters.

person Luis    schedule 25.11.2013
comment
решено в более новых версиях pylint Что? У меня последняя версия Pylint (1.4.0), и я все еще получаю эту ошибку. - person Meredith; 10.01.2015
comment
Я только что пробовал в разных виртуалках с 0.26.0, 1.0.0 и 1.4.0, и он по-прежнему показывает для меня те же результаты: самая старая версия требует CAPITAL_CASE, а две более новые версии CamelCase. Я предлагаю вам попробовать еще раз (остерегайтесь пользовательского .pylintrc в вашем домашнем каталоге) и зарегистрировать отчет об ошибке регрессии у разработчиков. - person Luis; 12.01.2015
comment
Я тоже получаю эту ошибку с pylint 1.4.0 и конфигурацией по умолчанию. - person simon; 04.04.2015
comment
Я все еще вижу это в pylint3 1.6.5. - person ʇsәɹoɈ; 16.11.2017

Вы можете игнорировать pylint здесь, вы правильно используете соглашение об именах для верблюдов.

Вы можете подавить предупреждение:

PersonData = collections.namedtuple('PersonData', 'name surname age')  # pylint: disable-msg=C0103

namedtuple — это фабрика классов, поэтому используйте соглашения об именах для класса.

person Martijn Pieters    schedule 14.11.2013
comment
Только одна маленькая деталь: я предпочитаю встроенные комментарии pylint в этом формате: - person kert; 21.07.2015

Это было исправлено в pylint-1.0.0 (см. Журнал изменений Pylint):

Для назначения имени верхнего уровня будет использоваться регулярное выражение имени класса, если pylint может определить, что значение в правой части является классом (например, collections.namedtuple()).

Обратите внимание, что namedtuple должен быть определен на верхнем уровне, если он определен, например. внутри функции pylint по-прежнему будет выдавать предупреждение invalid-name.

person dsandbrink    schedule 20.01.2017

в таком случае pylint должен обнаружить, что имя присвоено классу, и использовать регулярное выражение имени класса.

Отправьте запрос на http://bitbucket.org/logilab/pylint.

person sthenault    schedule 18.11.2013