Ihre Frage hat mich neugierig gemacht, so dass ich sah in einigen realen Welt Code: die Python-Standardbibliothek. Ich habe 67 Beispiele für verschachtelte Funktionen gefunden. Hier sind ein paar, mit Erklärungen.
Ein sehr einfacher Grund, eine verschachtelte Funktion zu verwenden, ist einfach, dass die zu definierende Funktion nicht global sein muss, weil nur die umschließende Funktion sie verwendet. Ein typisches Beispiel aus Python quopri.py Standard-Bibliothek-Modul:
def encode(input, output, quotetabs, header = 0):
...
def write(s, output=output, lineEnd='\n'):
# RFC 1521 requires that the line ending in a space or tab must have
# that trailing character encoded.
if s and s[-1:] in ' \t':
output.write(s[:-1] + quote(s[-1]) + lineEnd)
elif s == '.':
output.write(quote(s) + lineEnd)
else:
output.write(s + lineEnd)
... # 35 more lines of code that call write in several places
Hier gab es einige gemeinsame Code innerhalb der encode
Funktion, so der Autor einfach in eine write
Funktion herausgerechnet.
Eine andere übliche Anwendung für verschachtelte Funktionen ist re.sub
.Hier einige Code aus dem json/encode.py Standard-Bibliothek-Modul:
def encode_basestring(s):
"""Return a JSON representation of a Python string
"""
def replace(match):
return ESCAPE_DCT[match.group(0)]
return '"' + ESCAPE.sub(replace, s) + '"'
Hier ESCAPE
ist ein regulärer Ausdruck, und ESCAPE.sub(replace, s)
findet alle Spiele von ESCAPE
in s
und ersetzt jede mit replace(match)
.
In der Tat, jede API, wie re.sub
, die eine Funktion als Parameter akzeptiert kann zu Situationen führen, in denen verschachtelte Funktionen bequem sind. Zum Beispiel in turtle.py gibt es einige dumme Demo-Code, der dies tut:
def baba(xdummy, ydummy):
clearscreen()
bye()
...
tri.write(" Click me!", font = ("Courier", 12, "bold"))
tri.onclick(baba, 1)
onclick
Sie erwartet ein Event-Handler-Funktion zu übergeben, so definieren wir ein und geben es in
Ist es die Tatsache, dass die innere Funktion die Werte der Variablen im umschließenden Bereich behält, die Sie nicht erhalten? – Skilldrick