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?
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
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. Carte où c'est
filter
si vous définissez une lambda
à chaque foisfilter
si la fonction est prédéfiniefilter
et map
si vous map
, map
, ouTL; DR: utiliser la compréhension de la liste dans la plupart des cas
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
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é.