Ich habe eine Zeile wie diese:
filter(lambda x: x == 1, [1, 1, 2])
Pylint zeigt eine Warnung:
W: 3: Used builtin function 'filter'
Warum das? Ist ein Listenverständnis die empfohlene Methode?
Natürlich kann ich das so umschreiben:
[x for x in [1, 1, 2] if x == 1]
Und ich bekomme keine Warnungen, aber ich habe mich gefragt, ob es dafür einen PEP gibt?
python
list-comprehension
pylint
igorgue
quelle
quelle
map
, aber es gefällt auch nicht, wenn ich diemap
Funktion importierecytoolz
, um diese stattdessen zu verwenden.Antworten:
Pylint plaudert oft über Dinge, die es nicht sollte. Sie können die Warnung in einer .pylintrc-Datei deaktivieren.
Diese Seite http://pylint-messages.wikidot.com/messages:w0141 weist darauf hin, dass das Problem darin besteht, dass Filter und Karte durch Listenverständnisse ersetzt wurden.
Eine Zeile wie diese in Ihrer pylintrc-Datei löscht die Warnung:
quelle
[MESSAGES CONTROL]
(siehe Beispiel .pylintrc ), da jemand, der gerade diese Datei erstellt, möglicherweise nicht weiß, dass dies erforderlich ist.# pylint: disable=bad-builtin
. Oder in der Pylintrc :[MESSAGES CONTROL] disable=bad-builtin
. Es ist klarer, dass nur eine Warnnummer.Das Listenverständnis wird im Tutorial-Beispiel empfohlen, in dem angegeben ist
und von den meisten Antwortenden auf SOs Python List Comprehension Vs. Karte wo es ist
filter
wenn Sielambda
jedes Mal eine definierenfilter
wenn die Funktion vordefiniert istfilter
undmap
wenn Siemap
,map
oderTL; DR: Verwenden Sie in den meisten Fällen das Listenverständnis
quelle
Ich stieß auf das gleiche Problem und konnte es nicht herausfinden
warum die eingebaute Funktion "Eingabe" schlecht ist. Ich, du hast vor
um es zu deaktivieren:
Sobald Ihnen die Einstellungen gefallen:
pylint --bad-functions="[map,filter,apply]" --some-other-supercool-settings-of-yours --generate-rcfile > test.rc
Stellen Sie sicher, dass sich Ihre Einstellungen in der Datei befinden, z.
Danach können Sie diese Datei lokal verwenden
oder verwenden Sie es sogar als Standard-RC-Datei. Dafür verweise ich Sie freundlich
quelle
input()
ist böse, weil es tuteval(raw_input())
. Sie sollten immer verwendenraw_input()
. Hat in Python3input()
das gewünschte Verhalten (kehrt immer zurückstr
).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ückgegebenlist
:>>> 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 undlist(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.
quelle