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 как допустимых или недопустимых имен?
Вы можете найти правило, используемое в документации сообщений 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 совместимы при соблюдении следующих правил:
Иными словами, имена типовых переменных должны быть написаны либо в 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 (все в нижнем регистре с символами подчеркивания). регулярно делаю! Если вы сомневаетесь, в Википедии есть удобная таблица форматов из нескольких слов.
@Pierre.Sassoulas: вы совершенно правы! Не знаю, как я спутал их сегодня утром. Дох! :facepalm: И да, я теперь тоже запутал в грязи неправильное имя 'snake_case'. Мне нужен кофеин, ясно
Я создал regex101, чтобы вы могли легко проверить свои имена TypeVar на соответствие правилу из исходного кода pylint: regex101.com/r/1Hja8E/1
camelCase
естьlikeThis
,SeqFr
естьPascalCase
. Подводя итог, я бы сказал, что typevar должен быть регистром pascal, который может быть защищенным или закрытым с помощьюT
,_co
или_contra
в конце. Это соглашение, которое команда pylint создала из того, что мы видели, было сделано в другом проекте, но это еще не явным образом в PEP8 (поэтому оно может измениться, если будет создано официальное соглашение).