2016-05-22 2 views
2

Derzeit mein Code sieht wie folgt aus:Python3 Wie man mehrere Funktionen versucht, um Wert zu finden und zuzuweisen?

img = find_image_in_feed(feed) 
if img: 
    e.image = img 
if not e.image: 
    img = find_image_on_site(site) 
    if img: 
     e.image = img 

Es funktioniert, aber es sieht verwirrend und schwer zu erweitern. In Zukunft kann es mehrere weitere find_image (...) Funktionen geben. Gibt es ein "Designmuster", das ich in einer solchen Situation verwenden sollte? Meine zweite Idee sieht für mich auch nicht sauber aus, weil ich gleichzeitig Wert zugewiesen und überprüft habe.

if img = find_image_in_feed(feed): 
    e.image = img 
elif img = find_image_on_site(site): 
    e.image = img 

Ich möchte meinen Code so einfach zu lesen wie möglich sein, und ich habe das Gefühl, ich offensichtlich etwas fehlt bin.

+3

'e.image = img = find_image_in_feed (feed) oder find_image_on_site (site)'. Wenn du 'img' nirgends in deinem Code brauchst, wirf es einfach weg. – ozgur

+1

Ihr zweites Code-Snippet ist nicht gültig Python: Sie können C-style-Zuordnungen nicht innerhalb eines 'if'-Tests durchführen, da Python-Zuweisungsanweisungen keine Ausdrücke sind, so dass sie keinen testbaren Wert erzeugen. –

Antwort

3

können Sie or verwenden, die wie ein null coalescing operator funktioniert:

e.image = find_image_in_feed(feed) or find_image_on_site(site) 

Oben wird e.image auf find_image_in_feed(feed), wenn es etwas gibt, das den Wert true, es sonst Rücken auf dem Rückgabewert von find_image_on_site(site) fallen.

>>> value = 5 or 6 
>>> print(value) 
5 
>>> value = [] or [1, 2, 3] 
>>> print(value) 
[1, 2, 3] 

In Python ist or ein Kurzschluss-Operator, so wertet nur find_image_on_site(site) wenn find_image_in_feed(feed) falsch ist.

-

Wenn Sie nicht e.image-None gesetzt wird, wenn beide Anrufe None zurück:

e.image = find_image_in_feed(feed) or find_image_on_site(site) or e.image 
0

Ich sehe zwei mögliche Wege des Codes zu vereinfachen, ohne die Lesbarkeit zu beeinträchtigen.

A: Durch einmaliges Setzen des e.image.

img = find_image_in_feed(feed) 
if not img: 
    img = find_image_on_site(site) 
e.image = img 

B: Oder nutzen Python ternäre Operatoren

img = find_image_in_feed(feed) 
e.image = img if img else find_image_on_site(site) 

python ternary operators

Danke,

-Abe.

Verwandte Themen