Что такое спецификация имени TypeVar pylint?

Pylint выдает предупреждение всякий раз, когда происходит что-то подобное:

import typing

SEQ_FR = typing.TypeVar("SEQ_FR")
#^^^^^ gets underlined with the warning

Предупреждение такое: Type variable name "SEQ_FR" doesn't conform to predefined naming style. pylint(invalid-name)

Я попытался найти документацию Pylint, но безуспешно нашел точное используемое регулярное выражение/спецификацию. Не похоже, что для этого я также могу передать пользовательское регулярное выражение в Pylint, в отличие от обычных переменных, методов, функций, классов и т. д.

Какая спецификация используется Pylint для пометки переменных TypeVar как допустимых или недопустимых имен?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
693
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете найти правило, используемое в документации сообщений Pylint ; эта ошибка называется invalid-name, поэтому конкретную документацию можно найти на странице неверного имени / C0103 , которая имеет TypeVar правило в разделе Предопределенные шаблоны именования:

Тип имени: typevar
Хорошие имена: T, _CallableT, _T_co, AnyStr, DeviceTypeT, IPAddressT
Плохие имена: DICT_T, CALLABLE_T, ENUM_T, DeviceType, _StrType, TAnyStr

Здесь не задокументировано точное правило регулярного выражения, но Pylint фактически включит регулярное выражение, используемое в сообщении об ошибке, когда вы используете переключатель командной строки --include-naming-hint=y*):

Type variable name "SEQ_FR" doesn't conform to predefined naming style ('^_{0,2}(?!T[A-Z])(?:[A-Z]+|(?:[A-Z]+[a-z]+)+T?(?<!Type))(?:_co(?:ntra)?)?$' pattern) (invalid-name)

Кроме того, вы можете найти регулярное выражение для переменных типов в исходном коде.

Разбивая шаблон, имена typevar совместимы при соблюдении следующих правил:

  • При желании начните с 0-2 символов подчеркивания
  • не начинается с T<заглавная буква>
  • или
    • все заглавные буквы и без подчеркивания,
    • или PascalCaseWord ✝), необязательно заканчивающееся на T, без подчеркивания и не заканчивающееся на Type
  • с необязательным окончанием _co или _contra.

Иными словами, имена типовых переменных должны быть написаны либо в PascalCase ✝), либо заглавными буквами, могут быть защищенными (_) или закрытыми (__), могут быть помечены как ковариантные (_co) или контравариантные (_contra) и не должны заканчиваться на Type.

Подходящее имя для вашего примера может быть SeqFr или SeqFrT; суффикс T — это , чтобы было понятно, что имя SnakeCaseT — это переменная типа .

Кроме того, вы можете указать собственное регулярное выражение с помощью переключателя командной строки --typevar-rgx=<regex>*).

Примечание. Как отметил в комментарии Пьер Сассулас (сопровождающий Pylint): для именования типовых переменных не существует соглашения PEP-8 (пока); вместо этого команда PyLint зафиксировала правила, наблюдаемые в проектах Python, и документацию по подсказкам типов. Таким образом, точное правило все еще может быть изменено, если будет создано официальное соглашение.


*) Настройки кода Visual Studio для расширения Python включают параметр python.linting.pylintArgs, который принимает список переключателей командной строки.

✝) PascalCase также известен как CapitalizedWords, UpperCamelCase или StudlyCase. Не путайте это с camelCase (начальная буква в нижнем регистре) или змея_case (все в нижнем регистре с символами подчеркивания). регулярно делаю! Если вы сомневаетесь, в Википедии есть удобная таблица форматов из нескольких слов.

camelCase есть likeThis, SeqFr есть PascalCase. Подводя итог, я бы сказал, что typevar должен быть регистром pascal, который может быть защищенным или закрытым с помощью T, _co или _contra в конце. Это соглашение, которое команда pylint создала из того, что мы видели, было сделано в другом проекте, но это еще не явным образом в PEP8 (поэтому оно может измениться, если будет создано официальное соглашение).
Pierre.Sassoulas 27.11.2022 13:11

@Pierre.Sassoulas: вы совершенно правы! Не знаю, как я спутал их сегодня утром. Дох! :facepalm: И да, я теперь тоже запутал в грязи неправильное имя 'snake_case'. Мне нужен кофеин, ясно

Martijn Pieters 27.11.2022 13:13

Я создал regex101, чтобы вы могли легко проверить свои имена TypeVar на соответствие правилу из исходного кода pylint: regex101.com/r/1Hja8E/1

koks der drache 01.12.2022 17:30

Другие вопросы по теме