#python #python-2.7 #pylint
#питон #python-2.7 #пиллинт
Вопрос:
У меня есть приложение на Python, и из-за сторонней библиотеки мне приходится использовать Python 2.7, но я пытаюсь извлечь из этого максимум пользы.
Я скачал PyLint 1.9.5 и в основном заставляю его работать. Одна вещь, о которой я спотыкаюсь и не могу найти решение.
У меня есть несколько занятий, в основном таких:
class Narg(object): [snip] class Foo(object): def __init__(self): self.bar = None # type: Optional[list[Narg]] def find(self): if self.bar: for narg in self.bar: [snip]
пайлинту это не нравится, это дает мне
E:201,80: Non-iterable value self.bar is used in an iterating context (not-an-iterable)
Код работает нормально, так что на самом деле все хорошо, как я могу убедить в этом пайлинта?
Комментарии:
1. как вы инициализируетесь
bar
в чем-то другом, чемNone
?2. В классе Foo есть гораздо больше, чем я туда включил. панель настраивается на список Narg, когда они принимаются по сетевому подключению.
Ответ №1:
pylint
не имеет никакого способа узнать, что self.bar
позже может быть обновлено от того None
, чтобы быть повторяемым. Таким образом, у вас есть 2 варианта:
- Создать экземпляр
self.bar
в виде пустой итерации — например,self.bar = []
- отключить pylint:
self.bar = None # pylint: disable=not-an-iterable
Комментарии:
1. Разве не в этом весь смысл необязательного[], чтобы сказать pylint, что этот элемент иногда устанавливается, а иногда нет, и когда он установлен, это список[Narg]?
2. Я почти уверен, что майпи умнее этого. Я все время использую один и тот же тип кода. Может быть, попробуйте (1) сначала перейти
self.bar
к локальной переменной. или (2) изменить код, чтобы бытьfor narg in self.bar or ():
. Но да, я согласен, это кажется сломанным.3.
mypy
!=pylint
— если вы используете первое с набором текста, вам, вероятно, не нужно второе (или, по крайней мере, вам придется решать эти проблемы с wup).