Ho lavorato su un framework di test di base per una build automatizzata. La parte di codice seguente rappresenta un semplice test di comunicazione tra due macchine che utilizzano programmi diversi. Prima di eseguire qualsiasi test, voglio definirli completamente, quindi questo test non verrà eseguito fino a quando non saranno stati dichiarati tutti i test. Questo pezzo di codice è semplicemente una dichiarazione di un test.Lambdate Python e attacchi variabili
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)
In ogni caso, dopo l'esecuzione del test, viene eseguita la funzione definita da "passIf". Dal momento che voglio eseguire questo test per più client, li sto iterando e definendo un test per ciascuno: non un grosso problema. Tuttavia, dopo aver eseguito il test sul primo client, il "passIf" valuta l'ultimo nell'elenco dei client, non il "client" al momento della dichiarazione lambda.
La mia domanda, allora: quando Python lega i riferimenti variabili in lambda? Ho pensato che se usare una variabile esterna a lambda non fosse legale, l'interprete non avrebbe idea di cosa stavo parlando. Invece, si collegava in silenzio all'istanza dell'ultimo 'client'.
Inoltre, c'è un modo per forzare la risoluzione nel modo in cui l'ho intesa?
L'utilizzo del valore predefinito funziona perfettamente. Grazie! – stringer