Как я могу убедить pylint в том, что мой список можно повторять?

#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 варианта:

  1. Создать экземпляр self.bar в виде пустой итерации — например, self.bar = []
  2. отключить 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).