Wie bekomme ich Python-Listen-Verständnisse?

List-Verständnisse können in bestimmten Situationen nützlich sein, aber sie können auch ziemlich schrecklich zu lesen sein .. Als ein leicht übertriebenes Beispiel, wie würdest du folgendes einfügen?

allUuids = [x.id for x in self.db.query(schema.allPostsUuid).execute(timeout = 20) if x.type == "post" and x.deleted is not False] 

  • In Python, wann sollte ich eine Funktion anstelle einer Methode verwenden?
  • Lange Importe in Python
  • Mit statischen Methoden in Python - Best Practice
  • Pythonische Möglichkeit, einen Tokenizer zu implementieren
  • Javascript Stil dot Notation für Wörterbuch Schlüssel unpythonic?
  • Python-Stil
  • Python-Codierungsstandards / Best Practices
  • Python `if x ist nicht None` oder` if not x is None`?
  • 7 Solutions collect form web for “Wie bekomme ich Python-Listen-Verständnisse?”

    Es hängt davon ab, wie lange sie sind. Ich neige dazu, sie so zu strukturieren:

     [x.id for x in self.db.query(schema.allPostsUuid).execute(timeout=20) if x.type == 'post' and x.deleted is not False and ... and ...] 

    So hat jeder Ausdruck seine eigene Linie.

    Wenn irgendeine Linie zu groß wird, mag ich sie in einem Lambda oder Ausdruck ausziehen:

     transform = lambda x: x.id results = self.db.query(schema.allPostsUuid).execute(timeout=20) condition = lambda x: x.deleted is not False and ... and ... [transform(x) for x in results if condition(x)] 

    Und dann, wenn ein Lambda zu lang wird, wird es zu einer Funktion gefördert.

    Wo ich arbeite, würden unsere Coding-Richtlinien uns so etwas machen:

     all_posts_uuid_query = self.db.query(schema.allPostsUuid) all_posts_uuid_list = all_posts_uuid_query.execute(timeout=20) all_uuid_list = [ x.id for x in all_posts_uuid_list if ( x.type == "post" and not x.deleted # <-- if you don't care about NULLs / None ) ] 

    Für mich ist das zu viel. Vielleicht ist es nur ein schreckliches Beispiel, denn "type" und "deleted" wäre eindeutig Teil der db-Abfrage.

    Ich neige dazu zu denken, dass, wenn ein Listenverständnis mehrere Zeilen überspannt, es wahrscheinlich kein Listenverständnis sein sollte. Having said that, habe ich in der Regel nur die Sache auf "if" wie andere Menschen haben und werden hier beantworten.

     allUuids = [x.id for x in self.db.query(schema.allPostsUuid).execute(timeout = 20) if x.type == "post" and x.deleted is not False] 

    Sie sollten dafür kein Listenverständnis verwenden .

    List Verständnisse sind eine großartige Funktion, aber sie sind gemeint, um Verknüpfungen, nicht regelmäßigen Code.

    Für solch ein langer Schnipsel solltest du gewöhnliche Blöcke benutzen:

     allUuids = [] for x in self.db.query(schema.allPostsUuid).execute(timeout = 20) : if x.type == "post" and x.deleted is not False : allUuids.append(x.id) 

    Genau das gleiche Verhalten, viel besser lesbar. Guido wäre stolz auf dich 🙂

    Wie wäre es mit:

     allUuids = [x.id for x in self.db.query(schema.allPostsUuid).execute(timeout = 20) if (x.type == "post" and x.deleted is not False)] 

    Grundsätzlich können lange Zeilen vermieden werden, indem man Unterausdrücke in Variablen vorrechnet, was zu einer minimalen Leistungskosten führen könnte:

     query_ids = self.db.query(schema.allPostsUuid).execute(timeout = 20) allUuids = [x.id for x in query_ids if (x.type == "post" and x.deleted is not False)] 

    Übrigens, ist nicht " is not False " irgendwie überflüssig? Sind Sie besorgt über die Unterscheidung zwischen Nichts und Falschen? Denn sonst genügt es, die Bedingung nur zu verlassen: i f (x.type == "post" and x.deleted)

    Wenn Sie auf ein Verständnis gesetzt sind, ist orestis Antwort gut.

    Für komplexere Verständnisse so würde ich vorschlagen, mit einem Generator mit yield :

     allUuids = list(self.get_all_uuids()) def get_all_uuids(self): for x in self.db.query(schema.allPostsUuid).execute(timeout = 20): if x.type == "post" and x.deleted is not False: yield x.id 
    Python ist die beste Programmiersprache der Welt.