From 79c1fe27129f64251658685a03d9871b6bfbc5ba Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 1 Mar 2022 11:04:10 +0100 Subject: [PATCH] replace lambda with custom function callback --- openpype/tools/settings/settings/base.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index bbfbc58627..d4ad84996c 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -12,6 +12,22 @@ from .lib import create_deffered_value_change_timer from .constants import DEFAULT_PROJECT_LABEL +class _Callback: + """Callback wrapper which stores it's args and kwargs. + + Using lambda has few issues if local variables are passed to called + functions in loop it may change the value of the variable in already + stored callback. + """ + def __init__(self, func, *args, **kwargs): + self._func = func + self._args = args + self._kwargs = kwargs + + def __call__(self): + self._func(*self._args, **self._kwargs) + + class BaseWidget(QtWidgets.QWidget): allow_actions = True @@ -325,7 +341,11 @@ class BaseWidget(QtWidgets.QWidget): action = QtWidgets.QAction(project_name) submenu.addAction(action) - actions_mapping[action] = lambda: self._apply_values_from_project( + # Use custom callback object instead of lambda + # - project_name value is changed each value so all actions will + # use the same source project + actions_mapping[action] = _Callback( + self._apply_values_from_project, project_name ) menu.addMenu(submenu)