Проблема определения объема: когда срабатывает lambda
, он проверяет область действия для переменной cmd
. Во время каждой итерации for cmd in commands:
переменная cmd
устанавливается в новое значение. В конце итерации переменная cmd
в кадре равна окончательной итерации for cmd in commands:
(т. Е. - {'label': 'retrieve', 'reqId': 2}
).
Решение состоит в том, чтобы указать «новую» переменную в сигнатуре lambda
, которую он затем будет использовать из-за того, как работает область видимости в python (цитирует «new», потому что это может быть переменная с тем же именем ). В частности, вы можете изменить свой код на что-то вроде:
for cmd in commands:
self.rightMouse[treeName].add_command(label= cmd['label'],
command= lambda reqid = cmd['reqId']: self.execCommand(reqid))
Ниже приведен скрипт, демонстрирующий то, о чем я говорю, на примере:
lambdas = []
words = ["Hello","World"]
print("Creating Lambds")
for word in words:
my_lambda = lambda: word
print('>>> Result for "{}" lambda: "{}"'.format(word,my_lambda()))
lambdas.append(my_lambda)
print("Post Loop Lambda Results")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
word = "Foobar"
print('Setting word variable to "{}"'.format(word))
print("New Results for lambdas:")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
print("----------------\nSolution:\n")
lambdas = []
words = ["Hello","World"]
print("Creating Lambds")
for word in words:
my_lambda = lambda myword = word: myword
print('>>> Result for "{}" lambda: "{}"'.format(word,my_lambda()))
lambdas.append(my_lambda)
print("Post Loop Lambda Results")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
word = "Foobar"
print('Setting word variable to "{}"'.format(word))
print("New Results for lambdas:")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
Вот несколько ссылок: [ 1119]
У меня была подобная проблема, которые поражают мои 2 основных машины одновременно. При исследовании я нашел, что это было связано с Eset персональная безопасность (предполагающий, что недавнее обновление испортило что-то). Для решения его, я исключил VS2008 из активной фильтрации браузера - это находится в: установка-> усовершенствованная установка брандмауэра-> антивирус & антишпион-> защита веб-доступа-> HTTP-> webbrowsers
, Отменяющий выбор vsdev в здесь решенном проблема - интересно достаточно отключения брандмауэра и антивируса/, антишпион не решил проблему, таким образом, стоит искать подобную установку при выполнении другого защитного программного обеспечения
Сначала попытайтесь уничтожить весь "WebDev.WebServer.exe" процессы.
Hope это помогает
Странный!
номер порта хранится в .sln файле. Так, я унес бы это далеко файл решения сначала, воссоздал бы его и видел бы то, что происходит. Если бы это не помогает, я тогда перешел бы на web.config файл и сдул бы это и запустился бы снова также.