Así que olvidemos decoradores, que no tienen absolutamente nada que ver con el caso, y se centran en el cierre newfunc
. Una función anidada léxicamente puede referirse (aunque no reenlazar) a todos los nombres de variables locales (incluidos los nombres de los argumentos, ya que los argumentos son variables locales) de la (s) función (es) adjunta (s), es por eso que se conoce como cierre: está "cerrado". "variables libres". Aquí, newfunc
puede hacer referencia a func
y default
- y lo hace.
Las funciones de orden superior son muy naturales en Python, especialmente porque las funciones son objetos de primera clase (por lo que no hay nada especial que hacer para pasarlos como argumentos, devolverlos como valores de función o incluso almacenarlos en listas u otros contenedores, etc.), y no hay distinción de espacio de nombres entre funciones y otros tipos de objetos, no hay llamadas automáticas de funciones solo porque se mencionan, etc., etc. (Es más difícil, un poco más difícil o MUCHO más difícil, dependiendo - en otros idiomas que atraen muchas distinciones de este tipo). En Python, mencionar una función es solo eso, una mención; la llamada solo se produce si y cuando el objeto de función (al que se hace referencia por nombre o de otro modo) va seguido de paréntesis.
Eso es todo lo que hay a este ejemplo - por favor no dude en corregir su pregunta, comentar aquí, etc, si hay algún otro aspecto específico que usted permanece en duda acerca!
Editar: por lo que el OP comentó cortésmente pidiendo más ejemplos de "fábricas de cierre". Aquí hay uno - imaginar alguna clase abstracta de herramientas GUI, y que está tratando de hacer:
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
pero esto no funciona bien - i
dentro del lambda
es enlazada en tiempo, de manera que cuando uno se hace clic i
's valor siempre va a ser el índice del último botón , no importa donde se ha hecho una. Hay varias soluciones factibles, pero una fábrica de cierre es una posibilidad elegante:
def makeOnclick(message):
return lambda: mainwin.settitle(message)
for i in range(len(buttons)):
buttons[i].onclick(makeOnClick("button %d click!" % i))
Aquí, estamos utilizando la fábrica de cierre para ajustar el tiempo de unión de las variables -) En una forma específica u otra, se trata de una caso de uso bastante común para las fábricas de cierre.
¿No debería haber un espacio como "si IsMissing"? – recursive