#python #parameter-passing #keyword-argument
#python #передача параметров #ключевое слово-аргумент
Вопрос:
Я хочу передать dict вызовов функций с аргументами функции в виде kwargs другой функции. К сожалению, переданные функции выполняются немедленно, а не передаются, как показано в следующем примере:
def info(info='NO INFO'): # just a test function
print(); print(''', info, ''', sep=""); print()
kwargs = {'one': info('executed one'), 'two': info('executed two')}
что приводит к:
'executed one'
'executed two'
Как я могу предотвратить выполнение этих аргументов и просто передать их дальше?
Комментарии:
1.
info()
даже ничего не возвращает. Какими вы ожидаете значения аргументов при их передаче?
Ответ №1:
Вы не передаете функцию, вы передаете результат вызова функции. Python должен вызывать функцию (ы), как только она достигает этой строки: kwargs = {'one': info('executed one'), 'two': info('executed two')}
чтобы узнать, какие значения находятся в dict (которые в данном случае являются обоими None
— явно не то, что вы намереваетесь).
Как я уже сказал, вам нужно передать реальную функцию, что можно легко сделать с помощью (например, есть другие способы) лямбд — лямбд без аргументов не распространены, но разрешены:
kwargs = {'one': (lambda: info('executed one')), 'two': (lambda: info('executed two'))}
Комментарии:
1. Но тогда все, что он передает
kwargs
, должно знать, что оно должно вызывать значения, а не просто ссылаться на них.2. Да, конечно. Для меня это подразумевалось в исходном вопросе: что OP хотел передавать функции в словаре для последующего вызова, а не вызывать функции немедленно, как при ошибочной попытке. Возможно, я неправильно понял, но если это так, я надеюсь, что OP прояснит.
3. Я сомневаюсь, что он понимает что-либо из этого. Я думаю, что он хочет сделать что-то вроде
someFun(**kwargs)
4. Кажется, это работает.
code
kwargs = {‘one’: (lambda: info(‘выполнено одно’)), ‘two’: (lambda: info(‘выполнено два’))} print(kwargs.keys()) kwargs[‘one’]()code
Вывод: dict_keys([‘one’, ‘two’]) kwargs[‘one’]()5. У меня была небольшая проблема с форматированием приведенного выше комментария. Вот улучшенный вариант: то, что я пытаюсь сделать, это создать поток, который имеет целевую функцию с переменным количеством вызовов функций, передаваемых как dict. Предложенное решение @RobinZigmond, похоже, работает. Оператор ‘kwargs[‘one’]()’ выдает ‘executed one’, который является результатом вызова функции.