python - Listenverständnis ohne Zuweisung

7

Heute habe ich einen Verzeichnisindex mit einer Liste von Pfaden zu Zip-Dateien mit BeautifulSoup analysiert und bin auf eine interessante Sache gestoßen. Nehmen wir an, ich möchte alle href -Eigenschaften der Tags, die ich bekommen habe, nehmen und sie direkt in eine Warteschlange stellen:

%Vor%

Ich bin noch nie in eine Situation wie diese geraten, bei der ein Verständnis inline verwendet werden könnte, ohne es einem anderen zuzuweisen, nur um einen weiteren Iterator durch einen Routineaufruf zu generieren. Wird dies als schlechte Praxis angesehen? Ist es "Python", per se? Gab es einen besseren Einzeiler, um alle Artikel in die Warteschlange zu stellen?

    
DeaconDesperado 10.01.2013, 01:20
quelle

4 Antworten

8

Dies wurde oft gefragt, z. B. hier und hier . Aber es ist eine interessante Frage. List Comprehensions sollen für etwas anderes verwendet werden.

Andere Optionen umfassen

  1. Verwenden Sie map() - im Prinzip das gleiche wie Ihre Probe
  2. Verwenden Sie filter() - Wenn Ihre Funktion None zurückgibt, erhalten Sie eine leere Liste
  3. Nur ein einfacher for -loop

, während die einfache Schleife der bevorzugte Weg ist. Es ist in diesem Fall semantisch korrekt, alle anderen Wege, einschließlich Listenverständnis, Missbrauchskonzepte für ihre Nebenwirkung.

In Python 3.x sind map() und filter() Generatoren und tun daher nichts, bis Sie über sie iterieren. Also würden wir zum Beispiel ein list(map(...)) brauchen, was es noch schlimmer macht.

    
Thorsten Kranz 10.01.2013, 01:29
quelle
6

Wenn Sie es als eine Schleife über die Liste betrachten, die von soup.findAll zurückgegeben wird, würde es so aussehen:

%Vor%

Dies ist wahrscheinlich die eher "pythonische" Form als "explizit ist besser als impliziert"

    
timc 10.01.2013 01:25
quelle
2

Wahrscheinlich kein besserer Einzeiler, aber ich würde (persönlich) darüber nachdenken, anstatt:

%Vor%

schlechte Praxis sein. Erstens erzeugt der eine Liner eine Liste voller [None] , was wahrscheinlich ineffizienter ist. Zweitens ist nicht sofort klar, was der Code tut; Wenn man ein Listenverständnis sieht, wird die resultierende Liste in der Regel verwendet.

    
Yuushi 10.01.2013 01:26
quelle
2

Es gibt viele Meinungen zu diesem Thema, ich kann nur von Codierungskonventionen in meiner Organisation sprechen.

es gibt viele Möglichkeiten, eine Schleife zu beeinflussen, aber ein Schlüsselattribut der Listenkomprehension ist, dass sie Listen erstellen , mit jeweils einem Element in der iterierten Over-Sequenz.

%Vor%

Diese unbenutzte Liste ist offensichtlich verschwenderisch. Als solche diese Konstruktion ein Listenverständnis mit unbenutztem Rückgabewert; Es ist verboten, in unserer Codebasis zu erscheinen. Eine explizite Schleife wie oben oder eine generierte Kombination mit etwas, das sie verbraucht, zum Beispiel:

%Vor%

oder einfach:

%Vor%

wird benötigt, um die Überprüfung zu bestehen.

    
quelle

Tags und Links