In Python habe ich darüber nachgedacht, wie man eine Funktion schreibt, die einen Kurzschluss auswertet und einen anderen Wert als None zurückgibt, der zuerst angezeigt wurde.
Führen Sie zunächst als Beispiel die Funktion "get_answer ()" aus, die drei Ausdrücke "yahoo ()", "google ()" und "ask ()" nacheinander auswertet und einen anderen Wert als "None" zurückgibt, der zuerst angezeigt wird. Ich habe get_answer.py normal geschrieben. Der Vorgang wurde mit Python 2.7.3 und Python 3.2.3 bestätigt.
get_answer.py
#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import print_function
yahoo = lambda *_: print("in yahoo()") or None
google = lambda *_: print("in google()") or 0
ask = lambda *_: print("in ask()") or "draw"
def get_answer(question):
answer = yahoo(question)
if answer is None:
answer = google(question)
if answer is None:
answer = ask("sagami", question)
return answer
if __name__ == '__main__': # pragma: nocover
print("Answer is {}.".format(get_answer("1 - 1")))
Wenn Sie dies tun,
in yahoo()
in google()
Answer is 0.
Wird angezeigt. ask (" sagami ", question)
wurde nicht bewertet, da wir google (question)
ausgewertet haben und einen anderen Wert als None, 0 erhalten haben.
Wenn Sie die Verschachtelung von if-Anweisungen flach machen möchten, erhöht sich die Anzahl der Zeilen geringfügig.
def get_answer(question):
answer = yahoo(question)
if answer is not None:
return answer
answer = google(question)
if answer is not None:
return answer
return ask("sagami", question)
Sie können auch so schreiben. Aber diese Funktion
def get_answer(question):
return (yahoo(question) or
google(question) or
ask("sagami", question))
Oder
def get_answer(question):
for answer in (yahoo(question),
google(question),
ask("sagami", question)):
if answer is not None:
return answer
return None
Kann nicht so geschrieben werden. Wenn der erstere ausgeführt wird,
in yahoo()
in google()
in ask()
Answer is draw.
Und 0, ein anderer Wert als None, wird ignoriert, und wenn letzterer ausgeführt wird,
in yahoo()
in google()
in ask()
Answer is 0.
Daher wird auch "Fragen (" Sagami ", Frage)" bewertet, das nicht bewertet werden muss.
Infolge verschiedener Probleme dort, indem Sie den Dekorateur "@ any" verwenden,
@anyone
def get_answer(question):
yield yahoo(question)
yield google(question)
yield ask("sagami", question)
Ich habe mir einen Weg ausgedacht, um zu schreiben. Der Inhalt von "@ any" ist
def anyone(function):
def _(*args, **kwargs):
for value in function(*args, **kwargs):
if value is not None:
return value
return None
return _
ist. Ich denke, dass get_answer () einfach geschrieben werden kann, aber wie wäre es damit? Ich würde es begrüßen, wenn Sie mir sagen könnten, ob es einen anderen besseren Weg gibt.
Unten wird get_answer.py mit @ any
umgeschrieben.
get_answer.py
#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import print_function
yahoo = lambda *_: print("in yahoo()") or None
google = lambda *_: print("in google()") or 0
ask = lambda *_: print("in ask()") or "draw"
def anyone(function):
def _(*args, **kwargs):
for value in function(*args, **kwargs):
if value is not None:
return value
return None
return _
@anyone
def get_answer(question):
yield yahoo(question)
yield google(question)
yield ask("sagami", question)
if __name__ == '__main__': # pragma: nocover
print("Answer is {}.".format(get_answer("1 - 1")))
Recommended Posts