Проблемы с назначением в Tkinter Right Click с лямбда-функцией

Размещение new также очень полезно при сериализации (скажем, с boost :: serialization). В 10 лет c ++ это только второй случай, когда мне нужно новое место для размещения (третий, если вы включаете интервью :)).

-1
задан VengaVenga 16 January 2019 в 22:51
поделиться

1 ответ

Проблема определения объема: когда срабатывает 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]

0
ответ дан Reid Ballard 16 January 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: