我想使用字典在python中调用函数。

这是一些代码:

d = dict(param='test')

def f(param):

print(param)

f(d)

这打印{'param': 'test'},但我希望它只打印test。

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

d = dict(p1=1, p2=2)

def f2(p1, p2):

print(p1, p2)

f2(d)

这可能吗?

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

所以我的例子变成:

d = dict(p1=1, p2=2)

def f2(p1,p2):

print p1, p2

f2(**d)

如果你想要这个帮助别人,你应该重新提出你的问题:问题不是传递字典,你想要的是将字典变成关键字参数

值得注意的是,您还可以将列表解压缩到位置参数:f2(* [1,2])

"dereference":在这个Python上下文中,通常的术语是"解包"。 :)

这很好,只是将它与argparse / __ dict__一起使用,使命令行参数直接解析为类对象的选项变得非常容易。

在将字典作为参数传递给函数时,我们想要解压缩字典的原因是什么?

@MonaJalal将它转发到另一个带**kwargs的函数;它会期望一个解包的参数列表,而不仅仅是一个参数字典。

@MonaJalal如果要执行ast.literal_eval(someText)这样的操作会很有用,它可以将someText转换为字典;那么你可以将它解压缩到一个方法中(如果你想要别名关键字等,可以先解析someText以更好地匹配方法中的关键字)。因此,这将是一种允许数据输入(完成触发方法)的方法,它不需要多种形式,方框,鼠标点击等,而无需一直编辑.py文件本身(并且它是可能无数的一个例子,其中解包字典可能是有用的)。

@Dave,如何将param转换为'param',我的意思是如何将变量名转换为字符串:-))

这是一个问题@ user2728397?

@DaveHillier是的,只是好奇,变量名称内部如何变成字符串,当你将字典传递给函数调用时也会发生这种情况,所有字符串的键都被转换回变量名,python内部如何做到这一点,它可以在python解释器中完成,还是仅仅是内部操作。

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

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

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

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

字典不能包含不在函数中的参数。

例子:

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

In[5]: mydict = {'a': 100}

In[6]: myfunc(**mydict)

100 2

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

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

In[8]: myfunc(a=3, **mydict)

TypeError: myfunc() got multiple values for keyword argument 'a'

数字3:字典不能包含不在函数中的参数。

In[9]:  mydict = {'a': 100, 'b': 200, 'c': 300}

In[10]: myfunc(**mydict)

TypeError: myfunc() got an unexpected keyword argument 'c'

根据评论中的要求,Number 3的解决方案是根据函数中可用的关键字参数过滤字典:

In[11]: import inspect

In[12]: mydict = {'a': 100, 'b': 200, 'c': 300}

In[13]: filtered_mydict = {k: v for k, v in mydict.items() if k in [p.name for p in inspect.signature(myfunc).parameters.values()]}

In[14]: myfunc(**filtered_mydict)

100 200

另一个选择是接受(并忽略)函数中的其他kwargs:

In[15]: def myfunc2(a=None, **kwargs):

In[16]:    print(a)

In[17]: mydict = {'a': 100, 'b': 200, 'c': 300}

In[18]: myfunc2(**mydict)

100

请注意,您可以使用位置参数和列表或元组,与kwargs一样有效,这里是一个包含以上所有内容的更高级示例:

In[19]: def myfunc3(a, *posargs, b=2, **kwargs):

In[20]:    print(a, b)

In[21]:    print(posargs)

In[22]:    print(kwargs)

In[23]: mylist = [10, 20, 30]

In[24]: mydict = {'b': 200, 'c': 300}

In[25]: myfunc3(*mylist, **mydict)

10 200

(20, 30)

{'c': 300}

使用print.format解压缩特别有用。例如:'hello {greeting} {name}'.format( **{'name': 'Andrew', 'greeting': 'Mr'})

这应该是公认的答案。

旧问题但仍然非常相关。感谢您的详细回复。你知道如何处理案例3吗?当字典中的项目多于参数时,意味着将字典的项目pythonically映射到函数参数?

@spencer解决方案已添加到答案中。

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

最好将链接的相关内容复制到您的答案中,而不是依赖链接存活直到时间结束。

@Richard这是对网络的深刻哲学观点,我不能更加不同意这一点!唉,我在这里没有足够的空间来分享我的精彩证明......

@llimllib,我将不得不问Wiles博士!

在这里你去 - 只是任何其他迭代:

d = {'param' : 'test'}

def f(dictionary):

for key in dictionary:

print key

f(d)

似乎人们在回答原始问题而不是重新提出的问题时,正在低估这一点。我建议现在删除这篇文章。

@dotancohen没有它永远不正确,它失败了第二块代码总是与问题。从字面上看,印刷就是一个例子。

它确实回答了这个问题,它只是不通过字典解包来做到这一点。根据发布的问题,他的方法完全有效。

shell调用python脚本传递命名关键字参数_关于python:将字典作为关键字参数传递给函数...相关推荐

  1. python 实例方法调用时可以忽略第一个参数_盘点Python中易忽略的函数

    Python 内置函数 1.ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数, ...

  2. python引用传递产生的问题_理解Python中传递值和引用时出现问题

    我可以看到三个基本的Python概念,它们可以为这个问题提供一些启示: 1)首先,来自可变对象的赋值,如self.foo = arg1 就像复制指针(而不是所指向的值):self.foo和{}是相同的 ...

  3. python中关于命名的例子_利用Python批量重命名文件(给非技术人员的Python实例参考)...

    Python是一门"优雅"的计算机语言,而且就算10岁的小朋友也能学会,我一直向我身边的同学朋友同事推荐,不管他会不会编程. 这一回我需要完成的任务是把"照片" ...

  4. python脚本传递参数

    argparse基本用法 argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数.它的使用也比较简单. 1.基本框架 下面是采用argparse从命令行获取用户名,该py ...

  5. python从外部传入参数_从另一个Python脚本运行一个Python脚本,并传入参数 - python...

    我想从另一个Python脚本运行一个Python脚本.我想像使用命令行一样传递变量. 例如,我将运行我的第一个脚本,该脚本将遍历值列表(0.1.2.3),并将其传递给第二个脚本,依次为script2. ...

  6. python传中文参数_解决Python传递中文参数的问题

    今天有个需要需要传递中文参数给URL 但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误.烦的很. 所以我们果断选择用urlencode来处理中文, 由于国内外网站编码不同,国 ...

  7. 标签中的onclick调用js方法传递多个参数的解决方案

    标签中的onclick调用js方法传递多个参数的解决方案 参考文章: (1)标签中的onclick调用js方法传递多个参数的解决方案 (2)https://www.cnblogs.com/twohea ...

  8. linux运行python脚本语句,如何在Linux下运行Python脚本

    1.使用python的IDEL运行python 如果你的Linux安装了python,Ctrl+Alt+T打开Terminal后输入指令:python,会出现>>>,这个时候就可以在 ...

  9. c4d python使用方法_Cinema 4D Python脚本编写必须知道的5行Python代码教程

    Cinema 4D Python脚本编写必须知道的5行Python代码教程 在这期Cinema 4D python教程中的第一篇.Alpha Pixel将介绍如何使用python脚本进行设置,并查看一 ...

最新文章

  1. /etc/sysctl.conf参数解释
  2. 安徽大学计算机考研失败,回馈:2014年安徽大学计算机初试回忆题,我是雷锋,低调...
  3. NYOJ541 最强DE 战斗力(第五届省赛试题)
  4. tensorflow 之 最近用到的几个小操作tf.reshape,tf.convert_to_tensor,tf.where
  5. 40 个顶级 jQuery 图片、内容滑块和幻灯片
  6. 签名程序集密钥文件路径
  7. java结构设计_Java基本的程序设计结构(一)
  8. 用canvas给自己的博客园加背景(二)
  9. Using a Comparison Function for the Key Type
  10. 尼奥智能陪伴机器人如何绑定设备_巴巴腾 智能陪护儿童机器人A3,为儿童专业定制的小伙伴...
  11. C语言(二)C语言程序结构及简单的C程序举例
  12. Python基础-计算时间差,时间和,精确到秒,微秒,毫秒
  13. Android平板的磁盘分区,平板电脑硬盘分区 Original Pad到PC:教您将Win10安装到Android平台...
  14. matplotlib实现区域颜色填充
  15. CFA一级学习笔记--固定收益(一)--基本概念
  16. 查找算法【平衡二叉树】 - 平衡二叉树的删除
  17. 量化评价和质化评价举例_量化评价和质性评价异同点
  18. 【历史上的今天】10 月 22 日:微软发布 Windows 7;谷歌推出广告平台;静电复印机雏形
  19. DSSS信号的分类(周期长码短码与非周期长码)
  20. Win10系统adb无法使用

热门文章

  1. 四、shell编程练习题(1-20)
  2. C语言第七次作业---要死了----
  3. shell字符串长度
  4. 【转】程序员技术练级攻略
  5. SQL中Case语句用法讨论
  6. 设计模式---状态模式
  7. 最里层的是child元素
  8. PyTorch载入图片后ToTensor解读(含PIL和OpenCV读取图片对比)
  9. 第12天--css三种定位及z-index
  10. COGS——T 803. [USACO Hol10] 政党 || 1776: [Usaco2010 Hol]cowpol 奶牛政坛