【问题标题】:How to pass kwargs with function calls without immediate execution如何在不立即执行的情况下通过函数调用传递 kwargs
【发布时间】:2020-08-26 18:44:49
【问题描述】:

我想将带有函数参数的函数调用字典作为 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'

如何防止这些参数被执行并被传递?

【问题讨论】:

  • info() 甚至不返回任何内容。当你传递它时,你期望参数值是什么?

标签: python parameter-passing keyword-argument


【解决方案1】:

您不是在传递函数,而是在传递调用函数的结果。 Python 必须在到达该行后立即调用函数:kwargs = {'one': info('executed one'), 'two': info('executed two')} 以便知道 dict 中的值是什么(在这种情况下都是 None - 显然不是你想要的)。

正如我所说,您需要传递一个实际的函数,这可以通过(例如,有其他方法)lambdas 轻松完成 - 不带参数的 lambdas 不常见但允许使用:

kwargs = {'one': (lambda: info('executed one')), 'two': (lambda: info('executed two'))}

【讨论】:

  • 但是无论他通过kwargs 需要知道它必须调用这些值,而不仅仅是引用它们。
  • 是的,当然。对我来说,这在原始问题中是隐含的:OP 想要传递字典中的函数以便稍后调用,而不是像错误尝试那样立即调用函数。也许我误解了,但如果是这样,我希望 OP 能澄清一下。
  • 我怀疑他是否理解这些。我认为他想做类似someFun(**kwargs)
  • 这似乎有效。 code kwargs = {'one': (lambda: info('executed one')), 'two': (lambda: info('executed two'))} print(kwargs.keys()) kwargs['one ']() code 输出:dict_keys(['one', 'two']) kwargs['one']()
  • 我在格式化上述评论时遇到了一点问题。这是一个改进的:我想要做的是创建一个线程,该线程具有一个目标函数,其中函数调用的数量可变,作为 dict 传递。 @RobinZigmond 提出的解决方案似乎有效。语句 'kwargs['one']()' 产生 'executed one' 这是函数调用的结果。
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2012-11-25
  • 2019-06-26
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多