2

Ich bin nicht sehr vertraut mit Python-Syntax, und frage mich, ob jemand mir erklären kann, wie die Variable match wird an einer Schnur in der for Ausdruck in dieser Funktion gefunden unter:Was macht das Komma in dieser Aufgabe?

def find_project(project_name):  
    projects = get_projects()  
    try: 
     match, = (proj for proj in projects if proj["name"].strip() == project_name) 
     return match 
    except ValueError: 
     return None 

Antwort

5

Python können Sie zuweisen mehr als eine Variable auf einmal, wie folgt aus:

a, b = 1, 2 

wie dies funktioniert, ist durch die linke Seite der Zuordnung a, b als Tupel behandelt und in dem Tupel 1, 2 auf der rechten Seite jedes Element Zuweisen es .

Da Tupel hat nur ein Element, das folgende funktioniert auch:

a, = 1, 

Die rechte Seite einer Mehrfachzuordnung nicht ein Tupel sein muss. Jede iterable tun wird, solange die Anzahl der Elemente auf jeder Seite ist das gleiche:

a, b, c = "three little pigs".split() 

Wenn die Anzahl der Elemente nicht überein:

a, b, c = "oh", "no" 

... Sie erhalten einen ValueError :

ValueError: not enough values to unpack (expected 3, got 2) 

alle der oben genannten zusammen~~POS=TRUNC, dann Ihre Funktion:

def find_project(project_name):  
    projects = get_projects()  
    try: 
     match, = (proj for proj in projects if proj["name"].strip() == project_name) 
     return match 
    except ValueError: 
     return None 

... iteriert über die generator expression

(proj for proj in projects if proj["name"].strip() == project_name) 

... und wenn das Ergebnis ein Element hat, weist dieses Element zu match. Ist dies nicht der Fall, wird ValueError ausgelöst (und von der Klausel except abgefangen), keine Zuweisung erfolgt und None wird zurückgegeben.

Zwei Dinge zu beachten:

  1. Das Komma , leicht ist, wenn Code-Lese zu verpassen. Eine Alternative wäre die Liste Syntax auf der linken Seite verwenden:

    [match] = (proj for proj in projects if proj["name"].strip() == project_name) 
    

    ..., die die gleiche Wirkung hat.

  2. Wenn die rechte Seite ein Generator Ausdruck (oder eine andere Art von iterator) ist, können Sie next() mit einem Standardwert verwenden statt:

    def find_project(project_name):  
        projects = get_projects()  
        it = (proj for proj in projects if proj["name"].strip() == project_name) 
        return next(it, None) 
    

    ..., die kürzer und besser lesbar ist.