У меня такое же предупреждение о моем проекте.Я изменяю исходный код на py2 / 3-совместимый, и Pylint очень помогает.
Запуск pylint --py3k
показывает только ошибки о совместимости.
В Python 2, если используется filter
возвращает list
:
>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
[1, 1]
>>> type(my_list)
<type 'list'>
Но в Python 3 filter
и другие подобные методы (map
, range
, zip
, ..) возвращают итератор,это несовместимые типы и может вызвать ошибки в вашем коде.
>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
<filter object at 0x10853ac50>
>>> type(my_list)
<class 'filter'>
Чтобы сделать ваш код Python 2/3 совместимым, я использую шпаргалку с python future site
Чтобы избежать этого предупреждения, вы можете использовать 4 подхода, которые работают на питоне 2 и 3:
1 - Использование понимания списка, как вы сказали.
2 - Использование list
функция, предоставляющая, что return всегда является материализованным списком, результат одинаков для обеих версий python
>>> list(filter(lambda x: x == 1, [1, 1, 2]))
[1, 1]
3 - Использование lfilter
- это импорт пакета в будущем.Он всегда возвращает список, использует фильтр для py2 и list(filter(..)
для py3.Итак, оба питона имеют одинаковое поведение, а у вас более чистый синтаксис.
>>> from future.utils import lfilter
>>> lfilter(lambda x: x == 1, [1, 1, 2])
[1, 1]
4 - Лучший!Используйте filter
всегда в цикле, таким образом, Pylint не дает предупреждений, и это имеет хороший прирост производительности на Python 3.
>>> for number in filter(lambda x: x == 1, [1, 1, 2]):
>>> print(number)
>>> 1
>>> 1
Всегда предпочитайте функции, которые работают на Python 3, потому что Python 2скоро на пенсию.