J'ai le même avertissement sur mon projet. Je modifie le code source pour être compatible avec py2/3, et pylint m'aide beaucoup.
Running pylint --py3k
ne montre que les erreurs de compatibilité.
Dans python 2, si vous utilisez filter
il renvoie un 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
) renvoie un itérateur, c'est-à-dire des types incompatibles et peut-être des bogues 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 compatible avec python 2/3, j'utilise une antisèche de Site du futur python
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 - Utilisation d'un list
en accordant que le retour est toujours une liste matérialisée, le résultat est le même sur les deux versions de python.
>>> list(filter(lambda x: x == 1, [1, 1, 2]))
[1, 1]
3 - Utilisation lfilter
c'est un futur paquet importé. Il retourne toujours une liste, utilise le filtre sur py2, et list(filter(..)
sur py3. Ainsi, les deux pythons ont le même comportement et vous obtenez 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 dans une boucle, de cette façon, pylint ne donne pas d'avertissement, et il a une belle augmentation des performances 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é.
1 votes
Curieusement, pylint n'aime pas quand j'utilise la fonction intégrée
map
mais il n'aime pas non plus lorsque j'importe le fichiermap
de la fonctioncytoolz
pour utiliser ceci à la place.