Ich habe die gleiche Warnung auf meinem Projekt. Ich ändere den Quellcode so, dass er py2 / 3-kompatibel ist, und pylint hilft sehr.
Beim Ausführen pylint --py3k
werden nur Kompatibilitätsfehler angezeigt.
In Python 2 wird bei Verwendung filter
Folgendes zurückgegeben list
:
>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
[1, 1]
>>> type(my_list)
<type 'list'>
Aber in Python 3, filter
und anderen ähnlichen Verfahren ( map
, range
, zip
, ..) gibt einen Iterator, die inkompatible Typen und vielleicht Ursache Fehler in Ihrem Code.
>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
<filter object at 0x10853ac50>
>>> type(my_list)
<class 'filter'>
Um Ihren Code Python 2/3 kompatibel zu machen, verwende ich einen Spickzettel von der zukünftigen Python-Site
Um diese Warnung zu vermeiden, können Sie 4 Ansätze verwenden, die für Python 2 und 3 funktionieren:
1 - Verwenden Sie ein Listenverständnis, wie Sie gesagt haben.
2 - Gewähren Sie mithilfe einer list
Funktion, dass return immer eine materialisierte Liste ist. Das Ergebnis ist in beiden Python-Versionen gleich
>>> list(filter(lambda x: x == 1, [1, 1, 2]))
[1, 1]
3 - Mit lfilter
, das ist ein zukünftiger Paketimport. Es gibt immer eine Liste zurück, verwendet Filter für py2 und list(filter(..)
für py3. Beide Pythons haben also das gleiche Verhalten und Sie haben eine sauberere Syntax.
>>> from future.utils import lfilter
>>> lfilter(lambda x: x == 1, [1, 1, 2])
[1, 1]
4 - Das Beste! Verwenden Sie filter
immer in einer Schleife, auf diese Weise gibt Pylint keine Warnungen aus und hat eine schöne Leistungssteigerung auf Python 3.
>>> for number in filter(lambda x: x == 1, [1, 1, 2]):
>>> print(number)
>>> 1
>>> 1
Bevorzugen Sie immer Funktionen, die unter Python 3 funktionieren, da Python 2 bald eingestellt wird.
map
, aber es gefällt auch nicht, wenn ich diemap
Funktion importierecytoolz
, um diese stattdessen zu verwenden.