【问题标题】:Use string or dict to build Python function parameters [duplicate]使用字符串或字典构建 Python 函数参数 [重复]
【发布时间】:2016-07-27 12:28:20
【问题描述】:

我已经为此烦恼了一段时间。

给定这个函数:

def foo(param1, param2, param3):
    print 'param1 =', param1
    print 'param2 =', param2
    print 'param3 =', param3

在 Python 中可以做这样的事情吗?

string1 = 'param1'
string2 = 'param2'
string3 = 'param3'

foo(string1='val1', string2='val2', string3='val3') # Uber magic

还是这样的?

params = {
    'param1': 'val1',
    'param2': 'val2',
    'param3': 'val3'
}

foo(params) # Even ubener magic

所有魔法的结果应该相当于调用

foo(param1='val1', param2='val2', param3='val3')

顺便说一句,我没有兴趣更改功能以支持**kwargs

提前致谢!

【问题讨论】:

  • 我不清楚你想让第二个做什么。你能用语言解释并给出明确的预期输出吗,因为 tl;dr 是的,所有这些事情都是可能的(没有魔法:))
  • 这个想法是自动让解释器将 string1 值“param1”识别为函数的 param1 参数,无论我传递 string1、string2 或 string3“参数”的顺序如何。
  • “顺便说一句,我对更改函数以支持**kwargs 不感兴趣” - 函数是否使用**kwargs 参数定义与是否可以传递关键字参数无关**kwargs.
  • 好的,考虑到这一点,我投票决定以 dup 的身份关闭。我有点惊讶这里有这么多没有标志的答案,如果我理解,这个问题似乎在 SO Python normal arguments vs. keyword arguments 上有很多答案

标签: python


【解决方案1】:
>>> def foo(param1, param2, param3):
    print param1, param2, param3

>>> foo(*range(3))
0 1 2
>>> foo(**dict(param1=1,param2=2,param3=3))
1 2 3

【讨论】:

    【解决方案2】:
    params = {
        'param1': 'val1',
        'param2': 'val2',
        'param3': 'val3'
    }
    
    foo(**params) # Even ubener magic
    

    这被称为解包字典...

    【讨论】:

    • 你也可以params = ["foo", "bar", "baz"]; foo(*params)...
    • 这成功了!非常感谢!
    • @CiprianMandache 如果此答案为addressed your problem,请考虑accepting it,方法是单击答案左侧的复选标记/勾选,将其变为绿色。这标志着问题的解决令您满意,并向您和回答者奖励reputation。将问题标记为已回答可能有时间限制,但时间相对较短。
    • @MattDMo 感谢您提供信息!我刚加入,所以我是新手。
    • @CiprianMandache 没有问题。我想了很多,这就是我评论的原因。感谢您学习成为一名优秀的社区成员!
    【解决方案3】:

    正如@en_Knight 指出的那样,这些都是可以做到的

    要么:

    foo(param1='val1',param2='val2',param3='val3')
    

    或:

    foo(**params)
    

    如果你只想指定一些变量,你可以给函数默认变量(在这个确切的例子中不会那么有用):

    def foo(param1='', param2='', param3=''):
    

    然后您可以按任何顺序指定它们或省略其中一些,例如。

    foo(param3=2,param1=2)
    

    但如果某些变量的定义没有引用参数名称,则需要将它们放在第一位:

    foo(3,param=4) #param1 = 3, param2 = '', param3 = 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多