Значения словаря должны быть оценены перед созданием словаря. Нет никакого пути обойти это.
Что вы можете сделать, так это обернуть значения в функцию, а затем вызвать эту функцию позже:
logLevel = {
0: lambda: logger.debug(log),
1: lambda: logger.info(log),
2: lambda: logger.warning(log),
3: lambda: logger.error(log),
4: lambda: logger.critical(log)
}
log_f = logLevel[1]
log_f() # Will call the "lambda: logger.info(log)" function.
Значения все еще оцениваются, но теперь это вычисляемая функция, а не код, который она содержит.
Этого также можно достичь, используя functools.partial
from functools import partial
logLevel = {
0: partial(logger.debug, log),
1: partial(logger.info, log),
2: partial(logger.warning, log),
3: partial(logger.error, log),
4: partial(logger.critical, log)
}
log_f = logLevel[1]
log_f()
Ключевым моментом является необходимость отложить выполнение, и Обертка функции - самый простой (но не обязательно единственный) способ добиться этого.