У мене таке ж попередження щодо мого проекту. Я міняю вихідний код, щоб він був сумісним з py2 / 3, і pylint дуже допомагає.
Запуск pylint --py3k
показує лише помилки щодо сумісності.
У python 2, якщо use filter
, він повертає a 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
Щоб уникнути цього попередження, ви можете використовувати 4 підходи, які працюють на python 2 і 3:
1 - Використання розуміння списку, як ви сказали.
2 - Використання a 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 скоро буде скасовано.
map
, але він не любить, коли я імпортуюmap
функцію з,cytoolz
щоб використовувати це замість цього.