将字典作为关键字参数传递给python中的函数

Dav*_*ier 318 python parameters dictionary function keyword

我想使用字典在python中调用一个函数.

这是一些代码:

d = dict(param='test')

def f(param):
    print(param)

f(d)
Run Code Online (Sandbox Code Playgroud)

这打印{'param': 'test'}但我想它只是打印test.

我希望它能以更多参数的方式工作:

d = dict(p1=1, p2=2)
def f2(p1, p2):
    print(p1, p2)
f2(d)
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Dav*_*ier 491

最后为自己想出来了.这很简单,我只是缺少**运算符来解压缩字典

所以我的例子变成:

d = dict(p1=1, p2=2)
def f2(p1,p2):
    print p1, p2
f2(**d)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要这个帮助别人,你应该改写你的问题:问题不是传递字典,你想要的是将字典变成关键字参数 (51认同)
  • 值得注意的是,您还可以将列表解压缩到位置参数:f2(*[1,2]) (11认同)
  • "dereference":在这个Python上下文中,通常的术语是"解包".:) (10认同)
  • 这很好,只是将它与argparse/__ dict__一起使用,使命令行参数直接解析为类对象的选项变得非常容易. (2认同)

Dav*_*rks 103

一些可能有助于了解的额外细节(我在阅读本文并进行测试后遇到的问题):

  1. 该函数可以包含包含在字典中的参数
  2. 不能覆盖字典中已有的参数
  3. 字典不能包含不在函数中的参数.

每个例子:

In[1]: def myfunc(a=1, b=2):
In[2]:    print(a, b)

In[3]: mydict = {'a': 100, 'b': 200}

In[4]: myfunc(**mydict)
100 200
Run Code Online (Sandbox Code Playgroud)

数字1:该函数可以包含未包含在字典中的参数

In[5]: mydict = {'a': 100}
In[6]: myfunc(**mydict)
100 2
Run Code Online (Sandbox Code Playgroud)

数字2:您不能覆盖字典中已有的参数

In[7]: mydict = {'a': 100, 'b': 200}
In[8]: myfunc(a=3, **mydict)

TypeError: myfunc() got multiple values for keyword argument 'a'
Run Code Online (Sandbox Code Playgroud)

数字3:字典不能包含函数中没有的参数.

In[9]:  mydict = {'a': 100, 'b': 200, 'c': 300}
In[10]: myfunc(**mydict)

TypeError: myfunc() got an unexpected keyword argument 'c'
Run Code Online (Sandbox Code Playgroud)

  • 使用print.format解压缩特别有用.例如:`'hello {greeting} {name}'.format(**{'name':'Andrew','greeting':'Mr'})` (4认同)
  • @spencer解决方案已添加到答案中。 (2认同)
  • @Martlark使用[模板字符串](https://realpython.com/python-string-formatting/#4-template-strings-standard-library),它将像: `subst_dict = {'name': 'Andrew' ,'greeting': '先生'} title = '你好 $greeting $name' formatted_title = Template(title).substitute(**subst_dict)` (2认同)

lli*_*lib 30

在python中,这称为"解包",您可以在教程中找到它的一些内容.我同意,它的文档很糟糕,特别是因为它的幻想是多么有用.

  • 最好将链接的相关内容复制到您的答案中,而不是依赖链接存活直到时间结束. (16认同)
  • @Richard这是对网络的深刻哲学观点,我不能更加不同意这一点!唉,我在这里没有足够的空间来分享我的精彩证明...... (3认同)

Pat*_*ton 5

在这里-可以进行其他任何迭代:

d = {'param' : 'test'}

def f(dictionary):
    for key in dictionary:
        print key

f(d)
Run Code Online (Sandbox Code Playgroud)