wake-up-neo.com

Warum mag Pylint keine eingebauten Funktionen?

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.

72
igorgue

Pylint plaudert oft über Dinge, die es nicht tun sollte. Sie können die Warnung in einer .pylintrc-Datei deaktivieren.

Diese Seite http://pylint-messages.wikidot.com/messages:w0141 gibt an, dass das Problem darin besteht, dass Filter und Karte durch Listenverständnisse ersetzt wurden.

Eine Zeile wie diese in Ihrer Pylintrc-Datei wird die Warnung abstellen:

disable=W0141
91
Ned Batchelder

Warum das? Ist ein Listenverständnis die empfohlene Methode?

Das Listenverständnis wird in dem Tutorial-Beispiel empfohlen

es ist übersichtlicher und lesbarer.

und von den meisten Antwortern auf SOs Python List Comprehension Vs. Karte wo es ist

  1. effizienter um Listenverständnis zu verwenden als filter, wenn Sie jedes Mal eine lambda definieren
  2. vielleicht besser lesbar (und mit ähnlicher Effizienz), um filter zu verwenden, wenn die Funktion vordefiniert ist
  3. notwendig, um filter und map zu verwenden, wenn Sie
    • map map
    • curry map oder
    • funktionale Programmierung verwenden

TL; DR: Verwenden Sie in den meisten Fällen das Listenverständnis

9
serv-inc

Ich bin auf das gleiche Problem gestoßen und konnte es nicht herausfinden

warum die eingebaute Funktion `input 'schlecht ist. Ich beabsichtige

um es zu deaktivieren:

pylint --bad-functions = "[Karte, Filter, Anwenden]" YOUR_FILE_TO_CHECK_HERE

Sobald Sie die Einstellungen mögen: 

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

Stellen Sie sicher, dass Ihre Einstellungen in der Datei enthalten sind, z.

cat test.rc | grep -i YOUR_SETTING_HERE

Danach können Sie diese Datei lokal verwenden

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

oder verwenden Sie es sogar als Standard-RC-Datei. Dafür verweise ich Sie freundlich

pylint --long-help
4
benjamin

Ich habe dieselbe Warnung zu meinem Projekt erhalten. Ich ändere den Quellcode, um py2/3 kompatibel zu sein, und Pylint hilft sehr.

Beim Ausführen von pylint --py3k werden nur Fehler bezüglich der Kompatibilität angezeigt.

Bei Verwendung von filter gibt es in Python 2 eine list zurück:

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

In python 3 geben filter und andere ähnliche Methoden (map, range, Zip, ..) einen Iterator zurück, der inkompatible Typen ist und möglicherweise Fehler in Ihrem Code verursacht.

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

Um Ihren Code mit Python 2/3 kompatibel zu machen, verwende ich ein Spickzettel von python future site

Um diese Warnung zu vermeiden, können Sie 4 Ansätze verwenden, die mit 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 für beide Python-Versionen gleich

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

3 - Mit lfilter ist dies ein zukünftiger Paketimport. Es gibt immer eine Liste zurück, verwendet einen Filter für py2 und list(filter(..) für py3. Also haben beide Pythons dasselbe 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 auf Python 3 wird eine Leistungssteigerung von Nice erzielt.

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

Bevorzugen Sie immer Funktionen, die auf Python 3 funktionieren, da Python 2 bald zurückgezogen wird.

0