Почему Pylint не нравится встроенные функции? - PullRequest
72 голосов
/ 25 августа 2010

У меня есть такая строка:

filter(lambda x: x == 1, [1, 1, 2])

Pylint показывает предупреждение:

W:  3: Used builtin function 'filter'

Почему это? является ли использование списка рекомендуемым методом?

Конечно, я могу переписать это так:

[x for x in [1, 1, 2] if x == 1]

И я не получаю предупреждений, но мне было интересно, есть ли PEP для этого?

Ответы [ 4 ]

92 голосов
/ 25 августа 2010

Пилинт часто болтает о том, чего не следует.Вы можете отключить предупреждение в файле .pylintrc.

Эта страница http://pylint -messages.wikidot.com / messages: w0141 указывает на то, что фильтр и карта были замененысписок пониманий.

Такая строка в вашем файле pylintrc отключит предупреждение:

disable=W0141
9 голосов
/ 09 ноября 2015

Почему это?Является ли понимание списка рекомендуемым методом?

Понимание списка рекомендуется в учебном примере , в котором говорится, что

более кратко и читабельно.

и большинством отвечающих на SO * Python List Compceptionsion Vs.Карта , где

  1. более эффективно , чтобы использовать понимание списка, чем filter, если вы определяете lambda каждый раз
  2. возможно более читабельно (и с аналогичной эффективностью) для использования filter, если функция предопределена
  3. , необходимо использовать filter и map, если вы
    • map map,
    • curry map или
    • использовать функциональное программирование

TL; DR:использование списка в большинстве случаев

4 голосов
/ 04 августа 2013

Я столкнулся с той же проблемой и не мог понять

почему встроенная функция `input 'плохая. Я тебе намерен

чтобы отключить его:

pylint --bad-functions = "[карта, фильтр, применить]" YOUR_FILE_TO_CHECK_HERE

Когда вам понравятся настройки:

pylint --bad-functions="[map,filter,apply]" --some-other-supercool-settings-of-yours
--generate-rcfile > test.rc

Убедитесь, что ваши настройки находятся в файле, например ::

cat test.rc | grep -i YOUR_SETTING_HERE

После этого вы можете использовать этот файл локально

pylint --rcfile test.rc --your-other-command-line-args ...

или даже использовать его как файл по умолчанию. Для этого я прошу вас

pylint --long-help
0 голосов
/ 21 декабря 2018

У меня такое же предупреждение о моем проекте.Я изменяю исходный код на 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скоро на пенсию.

...