shell调用python脚本传递命名关键字参数_关于python:将字典作为关键字参数传递给函数...
我想使用字典在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:将字典作为关键字参数传递给函数...相关推荐
- python 实例方法调用时可以忽略第一个参数_盘点Python中易忽略的函数
Python 内置函数 1.ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数, ...
- python引用传递产生的问题_理解Python中传递值和引用时出现问题
我可以看到三个基本的Python概念,它们可以为这个问题提供一些启示: 1)首先,来自可变对象的赋值,如self.foo = arg1 就像复制指针(而不是所指向的值):self.foo和{}是相同的 ...
- python中关于命名的例子_利用Python批量重命名文件(给非技术人员的Python实例参考)...
Python是一门"优雅"的计算机语言,而且就算10岁的小朋友也能学会,我一直向我身边的同学朋友同事推荐,不管他会不会编程. 这一回我需要完成的任务是把"照片" ...
- python脚本传递参数
argparse基本用法 argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数.它的使用也比较简单. 1.基本框架 下面是采用argparse从命令行获取用户名,该py ...
- python从外部传入参数_从另一个Python脚本运行一个Python脚本,并传入参数 - python...
我想从另一个Python脚本运行一个Python脚本.我想像使用命令行一样传递变量. 例如,我将运行我的第一个脚本,该脚本将遍历值列表(0.1.2.3),并将其传递给第二个脚本,依次为script2. ...
- python传中文参数_解决Python传递中文参数的问题
今天有个需要需要传递中文参数给URL 但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误.烦的很. 所以我们果断选择用urlencode来处理中文, 由于国内外网站编码不同,国 ...
- 标签中的onclick调用js方法传递多个参数的解决方案
标签中的onclick调用js方法传递多个参数的解决方案 参考文章: (1)标签中的onclick调用js方法传递多个参数的解决方案 (2)https://www.cnblogs.com/twohea ...
- linux运行python脚本语句,如何在Linux下运行Python脚本
1.使用python的IDEL运行python 如果你的Linux安装了python,Ctrl+Alt+T打开Terminal后输入指令:python,会出现>>>,这个时候就可以在 ...
- c4d python使用方法_Cinema 4D Python脚本编写必须知道的5行Python代码教程
Cinema 4D Python脚本编写必须知道的5行Python代码教程 在这期Cinema 4D python教程中的第一篇.Alpha Pixel将介绍如何使用python脚本进行设置,并查看一 ...
最新文章
- /etc/sysctl.conf参数解释
- 安徽大学计算机考研失败,回馈:2014年安徽大学计算机初试回忆题,我是雷锋,低调...
- NYOJ541 最强DE 战斗力(第五届省赛试题)
- tensorflow 之 最近用到的几个小操作tf.reshape,tf.convert_to_tensor,tf.where
- 40 个顶级 jQuery 图片、内容滑块和幻灯片
- 签名程序集密钥文件路径
- java结构设计_Java基本的程序设计结构(一)
- 用canvas给自己的博客园加背景(二)
- Using a Comparison Function for the Key Type
- 尼奥智能陪伴机器人如何绑定设备_巴巴腾 智能陪护儿童机器人A3,为儿童专业定制的小伙伴...
- C语言(二)C语言程序结构及简单的C程序举例
- Python基础-计算时间差,时间和,精确到秒,微秒,毫秒
- Android平板的磁盘分区,平板电脑硬盘分区 Original Pad到PC:教您将Win10安装到Android平台...
- matplotlib实现区域颜色填充
- CFA一级学习笔记--固定收益(一)--基本概念
- 查找算法【平衡二叉树】 - 平衡二叉树的删除
- 量化评价和质化评价举例_量化评价和质性评价异同点
- 【历史上的今天】10 月 22 日:微软发布 Windows 7;谷歌推出广告平台;静电复印机雏形
- DSSS信号的分类(周期长码短码与非周期长码)
- Win10系统adb无法使用