【问题标题】:Passing custom keyword arguments to a function [duplicate]将自定义关键字参数传递给函数[重复]
【发布时间】:2013-09-13 12:01:20
【问题描述】:

我有一个具有update_database() 函数的程序,但直到运行时我才知道关键字参数是什么,所以有一次调用该函数时可能需要:

table_name = 'example1'
update_database(table_name, column1='...', column3='...')

但下次可能是:

table_name = 'example2'
update_database(table_name, column5='...', column2='...')

因此,函数调用需要混合使用常规参数和关键字参数。我可以作为列表访问的关键字参数名称,因此我可以以任何我喜欢的旧方式轻松格式化它们,但我不确定这种行为是否在 python 中是可能的。

有人知道这是否/如何可能吗?

更新:

还值得注意的是,update_database() 函数是导入模块的一部分,所以我不能修改它的定义,我可以以某种方式包装它,但我不确定这是否有什么好处。

【问题讨论】:

标签: python arguments keyword keyword-argument


【解决方案1】:

您始终可以在原始函数中使用未定义数量的关键字参数,例如:

(在关键字参数的情况下,你有一个简单的字典而不是一个列表)

def update_database(tname, **columns):
    for key, value in columns.items():
        # do something with key-value pairs

更新:

所以我想,这就是我们在评论部分谈论的内容,我说的对吗?

# Create dictionaries with keys as keywords and values as argument values
kwargs0 = {'arg0': 0, 'arg1': 2, 'arg2': 5}
kwargs1 = {'arg99': 1, 'arg13': None, 'arg0': 7}

# Call the function and UNPACK the dictionaries
update_database('db_name', **kwargs0)
update_database('db_name', **kwargs1)

【讨论】:

  • 不幸的是,我无法更改定义,因为update_database() 是来自外部模块的函数
  • 我可以向你展示如何用另一个函数包装一个函数,但我不太确定你想要达到的目标是什么。在传递给这个update_database 函数之前,您想重命名关键字吗?或者你想过滤它们,只传递一些关键字?还是?
  • 假设我有一个字典 keywords = {'arg1': 'value', 'arg2': 'value'},我想使用该字典作为函数的参数,例如:update_database('db_name', args=keywords) 而不是 update_database('db_name', arg1='value', arg2='value'),因为这些参数可能会在运行时发生变化,我希望这是有道理的
  • 我更新了我的答案,看看这是否符合您的需求@jonathantopf!
  • 就是这样,谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多