Как передавать kwargs с вызовами функций без немедленного выполнения

#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’, который является результатом вызова функции.