web-dev-qa-db-fra.com

Pourquoi Pylint n'aime-t-il pas les fonctions intégrées?

J'ai une ligne comme celle-ci:

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

Pylint affiche un avertissement:

W:  3: Used builtin function 'filter'

Pourquoi donc? la compréhension de liste est-elle la méthode recommandée?

Bien sûr, je peux réécrire ceci comme ceci:

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

Et je ne reçois aucun avertissement, mais je me demandais s'il y avait un PEP pour cela?

72
igorgue

Pylint discute souvent de choses qu'il ne devrait pas faire. Vous pouvez désactiver l'avertissement dans un fichier .pylintrc.

Cette page http://pylint-messages.wikidot.com/messages:w0141 indique que le problème est que le filtre et la carte ont été remplacés par des listes de propriétés.

Une ligne comme celle-ci dans votre fichier pylintrc atténuera l’avertissement:

disable=W0141
91
Ned Batchelder

Pourquoi donc? la compréhension de liste est-elle la méthode recommandée?

La compréhension de la liste est recommandée dans l’exemple de didacticiel , qui indique

c’est plus concis et lisible.

et par la plupart des répondants sur les SO Vs Prehon List Comprehension Vs. Cartec'est

  1. plus efficace pour utiliser la compréhension de liste que filter si vous définissez une lambda à chaque fois
  2. peut-être plus lisible (et avec une efficacité similaire) à utiliser filter si la fonction est prédéfinie
  3. nécessaire d'utiliser filter et map si vous
    • map map
    • curry map, ou
    • utiliser la programmation fonctionnelle

TL; DR: utiliser la compréhension de la liste dans la plupart des cas

9
serv-inc

J'ai rencontré le même problème et je ne pouvais pas comprendre

pourquoi la fonction intégrée `input 'est mauvaise. Je vous l'intention

pour le désactiver:

pylint --bad-functions = "[map, filter, apply]" YOUR_FILE_TO_CHECK_HERE

Une fois que vous aimez les paramètres: 

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

Vérifiez que vos paramètres figurent dans le fichier, par exemple:

cat test.rc | grep -i YOUR_SETTING_HERE

Après cela, vous pouvez utiliser ce fichier localement

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

ou même l'utiliser comme votre fichier rc par défaut. Pour cela, je vous renvoie gentiment à

pylint --long-help
4
benjamin

J'ai le même avertissement sur mon projet. Je change le code source pour qu'il soit compatible py2/3, et pylint aide beaucoup.

L'exécution de pylint --py3k n'affiche que les erreurs de compatibilité.

En python 2, si vous utilisez filter, il retourne une list:

>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
[1, 1]
>>> type(my_list)
<type 'list'>

Mais en python 3, filter et d’autres méthodes similaires (map, range, Zip, ..) renvoient un itérateur, qui est des types incompatibles et peut-être causer des bugs dans votre code.

>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
<filter object at 0x10853ac50>
>>> type(my_list)
<class 'filter'>

Pour rendre votre code python 2/3 compatible, j'utilise un aide-mémoire de python future site

Pour éviter cet avertissement, vous pouvez utiliser 4 approches, qui fonctionnent sur python 2 et 3:

1 - Utiliser une liste de compréhension comme vous l'avez dit.

2 - En utilisant une fonction list, accordez que return est toujours une liste matérialisée, le résultat est identique sur les deux versions de python

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

3 - Utiliser lfilter est une future importation de paquet. Il retourne toujours une liste, utilise filter sur py2 et list(filter(..) sur py3. Donc, les deux pythons ont le même comportement et vous avez une syntaxe plus propre.

>>> from future.utils import lfilter
>>> lfilter(lambda x: x == 1, [1, 1, 2])
[1, 1]

4 - Le meilleur! Utilisez filter toujours sur une boucle, de cette façon, pylint ne donnera pas d’avertissements, et il aura un gain de performances Nice sur python 3.

>>> for number in filter(lambda x: x == 1, [1, 1, 2]):
>>>     print(number)
>>> 1
>>> 1

Préférez toujours les fonctions qui fonctionnent sur python 3, car python 2 sera bientôt retiré.

0
Jorge Continuous