Su pregunta me causó curiosidad, así que parecía en algún código en el mundo real: la biblioteca estándar de Python. Encontré 67 ejemplos de funciones anidadas. Aquí hay algunos, con explicaciones.
Una razón muy simple para usar una función anidada es simplemente que la función que está definiendo no necesita ser global, porque solo la función envolvedora la usa. Un ejemplo típico de quopri.py módulo de la biblioteca estándar de Python:
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
Aquí había un poco de código común dentro de la función encode
, por lo que el autor se limita a factorizar a cabo en una función write
.
Otro uso común para las funciones de anidado es re.sub
.Aquí hay algo de código desde el módulo json/encode.py biblioteca estándar:
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) + '"'
aquí ESCAPE
es una expresión regular, y ESCAPE.sub(replace, s)
encuentra todos los partidos de ESCAPE
en s
y reemplaza cada uno con replace(match)
.
De hecho, cualquier API, como re.sub
, que acepta una función como un parámetro puede conducir a situaciones en las funciones anidadas son convenientes. Por ejemplo, en turtle.py hay algo de código de demostración tonta que hace esto:
def baba(xdummy, ydummy):
clearscreen()
bye()
...
tri.write(" Click me!", font = ("Courier", 12, "bold"))
tri.onclick(baba, 1)
onclick
que espera para pasar una función de controlador de eventos, por lo que definen uno y lo pasan en
¿Es el hecho de que la función interna conserva los valores de las variables en el alcance adjunto que no obtiene? – Skilldrick