Frage

Dies ist aus dem Quellcode von csv2rec in matplotlib

Wie kann diese Funktion arbeiten, wenn sein einziger Parameter 'Func, default'?

def with_default_value(func, default):
    def newfunc(name, val):
        if ismissing(name, val):
            return default
        else:
            return func(val)
    return newfunc

IsMissing nimmt einen Namen und einen Wert und bestimmt, ob die Zeile sollte in einem Array numpy maskiert werden.

func wird entweder str, int, float werden oder dateparser ... wandelt Daten. Vielleicht nicht wichtig. Ich frage mich nur, wie kann es einen ‚Namen‘ bekommen und einen ‚Wert‘

Ich bin ein Anfänger. Vielen Dank für all 2cents! Ich hoffe, gut genug, um anderen zu helfen!

War es hilfreich?

Lösung

Diese with_default_value Funktion ist, was oft zu (unpräziser) bezeichnet ist als „Verschluss“ (technisch gesehen, ist die Schließung eher die innere Funktion, die zurückgegeben wird, hier newfunc - siehe zB hier ). Allgemeiner, with_default_value a Funktion höherer Ordnung ist ( "HOF."): Eine Funktion (func) als Argument, es gibt auch eine Funktion (newfunc) als Ergebnis

Ich habe Antworten gesehen verwirrend dies mit dem Dekorateur Konzept und konstruieren in Python, die auf jeden Fall ist nicht der Fall ist - zumal man erwähnen func wie oft ein Wesen Einbau-wie int. Dekorateure sind auch Funktionen höherer Ordnung, sondern spezifische: diejenigen, die eine verzierte, dh „angereichert“, Version ihrer Funktionsargument zurückkehren (was sein muss, die nur Argument - „Dekorateure mit Argumenten“ wird durch eine weitere Ebene der Funktion / Schließ-Verschachtelung erhalten, nicht durch den Dekorateur HOF mehr als ein Argument) zu geben, die genau den gleichen Namen wie diese Funktion Argument zugewiesen werden (und so hat in der Regel die gleichen Unterschrift -. einen Dekorateur sonst wäre extrem eigentümlich, un-idiomatische, unlesbar unter Verwendung usw.)

Also vergessen Dekorateure, die absolut nichts mit dem Fall zu tun, und konzentrieren sich auf die newfunc Schließung. Eine lexikalisch verschachtelte Funktion beziehen sich auf (wenn auch nicht neu binden) alle lokalen Variablennamen (einschließlich Argumentnamen, da Argumente lokale Variablen sind) der einschließenden Funktion (en) - das ist, warum es als Verschluss bekannt ist: es diese „über geschlossen“ ist „freie Variablen“. Hier newfunc zu func und default beziehen -. Und tut

Funktionen höherer Ordnung eine sehr natürliche Sache in Python sind, vor allem, da Funktionen First-Class-Objekte sind (so gibt es nichts besonderes was Sie tun müssen, um sie als Argumente zu übergeben, kehren sie als Funktionswerte oder sogar sie in Listen speichern oder andere Behälter, usw.), und es gibt keine Namensraum Unterscheidung zwischen Funktionen und anderen Arten von Objekten ist, kein automatischer Aufruf von Funktionen, nur weil sie erwähnt sind, etc, etc. (Es ist schwieriger - ein bisschen schwieriger, oder viel schwieriger, je - in anderen Sprachen, die viele Unterscheidungen dieser Art tun ziehen). In Python ist eine Funktion zu erwähnen nur, dass - eine Erwähnung; nur die CALL passieren, wenn und wenn die Funktion Objekt (nach Namen oder auf andere Weise) durch Klammern gefolgt wird.

Das ist ungefähr alles, was es zu diesem Beispiel - bitte fühlen Sie sich frei, Ihre Frage zu bearbeiten, hier kommentieren, usw., wenn es ein anderer spezifischer Aspekt ist, dass Sie in Zweifeln bleiben über

Bearbeiten : so kommentierte der OP artig für weitere Beispiele für "closure Fabriken" zu fragen. Hier ist ein - eine abstrakte Art von GUI-Toolkit vorstellen, und Sie versuchen zu tun:

for i in range(len(buttons)):
  buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))

, aber das funktioniert nicht richtig - i im lambda ist spät gebunden, so durch die Zeit eine Schaltfläche geklickt wird Wert i immer sein wird, der Index der letzten Taste, unabhängig davon, welche wurde ein angeklickt. Es gibt verschiedene Lösungen denkbar, aber eine Schließung Fabrik ist eine elegante Möglichkeit:

def makeOnclick(message):
  return lambda: mainwin.settitle(message)

for i in range(len(buttons)):
  buttons[i].onclick(makeOnClick("button %d click!" % i))

Hier sind wir die Schließung Fabrik mit der Bindungszeit von Variablen zu optimieren -.) In einer speziellen Form oder einem anderen, das ist ein ziemlich häufiger Anwendungsfall für die Schließung Fabriken

Andere Tipps

Dies ist ein Python Dekorateur - im Grunde eine Funktion Wrapper. (Lesen Sie alles über Dekorateure in PEP 318 - http://www.python.org / dev / pep / pep-0318 / )

Wenn Sie den Code durchsehen, werden Sie wahrscheinlich so etwas wie dieses finden:

def some_func(name, val):
    # ...
some_func = with_default_value(some_func, 'the_default_value')

Die Absicht dieses Dekorateur scheint einen Standardwert zu liefern, wenn entweder der Name oder val Argumente fehlen (vermutlich, wenn sie auf keine festgelegt werden).

Was, warum es funktioniert:

with_default_value ein Funktionsobjekt zurückgibt, die im Grunde sein werden eine Kopie des verschachtelten newfunc, mit dem ‚Func‘ nennen und den Standardwert substited mit dem, was passiert war with_default_value.

Wenn jemand tut 'foo = with_default_value (Bar, 3)', der Rückgabewert wird im Grunde eine neue Funktion sein:

def foo(name, val):
    ifismissing(name, val):
        return 3
    else:
        return bar(val)

, so dass Sie dann, dass der Rückgabewert nehmen, und es nennen.

Dies ist eine Funktion, die eine andere Funktion zurückgibt. name und value sind die Parameter der Funktion zurückgegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top