Я работал над базовой структурой тестирования для автоматической сборки. Приведенный ниже фрагмент кода представляет собой простой тест связи между двумя машинами с использованием разных программ. Прежде чем я действительно сделаю какие-либо тесты, я хочу полностью определить их - так что этот тест ниже фактически не выполняется, пока все тесты не объявлены. Этот кусок кода является просто объявлением теста.
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)
Во всяком случае, после запуска теста он запускает функцию, определенную 'passIf'. Поскольку я хочу запустить этот тест для нескольких клиентов, я повторяю их и определяю тест для каждого - ничего страшного. Однако после запуска теста на первом клиенте «passIf» оценивает последний в списке клиентов, а не «клиент» во время лямбда-объявления.
Тогда мой вопрос: когда python связывает ссылки на переменные в лямбдах? Я подумал, что если использовать переменную извне лямбда, это не разрешено законом, интерпретатор понятия не имеет, о чем я говорю. Вместо этого он молча привязан к экземпляру последнего «клиента».
Кроме того, есть ли способ заставить разрешение так, как я его задумал?