He estado trabajando en un marco de prueba básico para una compilación automatizada. El fragmento de código siguiente representa una prueba simple de comunicación entre dos máquinas que utilizan diferentes programas. Antes de hacer algunas pruebas, quiero definirlas por completo, por lo que la siguiente prueba no se ejecuta hasta que se hayan declarado todas las pruebas. Este fragmento de código es simplemente una declaración de una prueba.Python Lambdas y enlaces de variable
remoteTests = []
for client in clients:
t = Test(
name = 'Test ' + str(host) + ' => ' + str(client),
cmds = [
host.start(CMD1),
client.start(CMD2),
host.wait(5),
host.stop(CMD1),
client.stop(CMD2),
],
passIf = lambda : client.returncode(CMD2) == 0
)
remoteTests.append(t)
De todos modos, después de ejecutar la prueba, ejecuta la función definida por 'passIf'. Como quiero ejecutar esta prueba para múltiples clientes, los estoy iterando y definiendo una prueba para cada uno, no es gran cosa. Sin embargo, después de ejecutar la prueba en el primer cliente, el 'passIf' se evalúa en el último en la lista de clientes, no en el 'cliente' en el momento de la declaración lambda.
Mi pregunta, entonces, ¿cuándo python enlaza las referencias variables en lambdas? Pensé que si usar una variable del exterior de la lambda no era legal, el intérprete no tendría idea de lo que estaba hablando. En cambio, se atiene silenciosamente a la instancia del último 'cliente'.
Además, ¿hay alguna manera de forzar la resolución de la forma en que lo pretendía?
El uso del valor predeterminado funciona perfectamente. ¡Gracias! – stringer