[PYTHON] Eine Funktion, die einen Kurzschluss auswertet und einen anderen Wert als None zurückgibt, der zuerst angezeigt wird.

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

Eine Funktion, die einen Kurzschluss auswertet und einen anderen Wert als None zurückgibt, der zuerst angezeigt wird.
Eine Funktion, die einen zufälligen Namen zurückgibt
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.