Python技巧:args 和 kwargs 原来这么强大
大家好,今天我给大家分享Python技巧:args 和 kwargs的相关技巧。喜欢记得收藏、关注、点赞。
注:完整代码、资料、技术交流文末获取
现在args和 kwargs参数仍然是 Python 中非常有用的特性,而且理解它们的威力将使您成为更有效的开发人员。
那么“args”和“kwargs”参数用来做什么呢?
它们允许一个函数接受可选参数,因此你能够在你的模块和类里创建弹性APIs。
示例代码如下:
In [2]: def foo(required, *args, **kwargs):...: print(required)...: if args:...: print(args)...: if kwargs:...: print(kwargs)
上面的函数需要至少一个叫做“必须的”参数,但是它也能接受额外的位置参数和关键字参数。
如果我们调用带有附加参数的函数,参数将会收集额外的位置参数作为一个元组,因为这个参数的名字有一个*(单星号)前缀。
同样地,kwargs将收集额外的关键字参数作为一个字典,因为这个参数名字有**(双星号)前缀。
如果没有附加参数被传递给函数。args 和 kwargs 可以为空。
当我们调用带有参数的不同组合的函数时,你会看到在args和kwargs内部参数。
Python如何收集它们,根据它们是否为位置参数或者关键字参数。代码如下:
In [3]: foo()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-c19b6d9633cf> in <module>
----> 1 foo()TypeError: foo() missing 1 required positional argument: 'required'
In [4]: foo('hello')
hello
In [5]: foo('hello', 1, 2, 3)
hello
(1, 2, 3)
In [6]: foo('hello', 1, 2, 3, key1='value', key2=999)
hello
(1, 2, 3)
{'key1': 'value', 'key2': 999}
我要明确一下,调用args和kwargs参数是简单的命名惯例。
像之前的例子里,如果称他们*parms和**argv也可以。实际上语法分别是单星号(*)或者双星号(**)。
然而,我还是推荐你还是坚持可接受的命名惯例以避免混淆。(而且每隔一段时间还有机会喊“argh!”和“kwargh!”)。
## 转发可选或者关键字参数
有可能从一个函数到另一个函数传递可选或者关键字参数。
当你调用要转发参数的函数时,你可以通过使用解包参数操作符*和**。在你传递之前这也给你一个机会修改参数。
示例如下:
In [8]: def foo(x, *args, **kwargs):...: kwarg['name'] = 'Alice'...: new_args = args + ('extra', )...: bar(x, *new_args, **kwargs)
这种技术对于子类化和编写包装函数很有用。
例如,您可以使用它来扩展父类的行为,而不必在子类中复制其构造函数的完整签名。
如果您使用的 API 可能会在您的控制之外发生变化,这会非常方便,示例代码如下:
In [9]: class Car:...: def __init__(self, color, mileage):...: self.color = color...: self.mileage = mileage...: In [10]: class AlwaysBlueCar(Car):...: def __init__(self, *args, **kwargs):...: super().__init__(*args, **kwargs)...: self.color = 'blue'In [12]: AlwaysBlueCar('green', 48392).color
Out[12]: 'blue'
AlwaysBlueCar 构造函数只是将所有参数传递给它的父类,然后覆盖一个内部属性。
这意味着如果父类构造函数发生更改,AlwaysBlueCar 很有可能仍会按预期运行。
这里的缺点是 AlwaysBlueCar 构造函数现在有一个相当无用的签名——如果不查找父类,我们不知道它需要什么参数。
通常,您不会将这种技术用于您自己的类层次结构。更有可能的情况是您想要修改或覆盖某些您无法控制的外部类中的行为。
但这总是危险的领域,所以最好小心(否则你可能很快就会有另一个理由尖叫“argh!”)。
这种技术可能有用的另一种情况是编写包装函数,例如装饰器。在那里,您通常还希望接受要传递给包装函数的任意参数。
而且,如果我们可以在不必复制和粘贴原始函数签名的情况下做到这一点,那可能更易于维护:
import functools
def trace(f):...: @functools.wraps(f)...: def decorated_function(*args, **kwargs):...: print(f, args, kwargs)...: result = f(*args, **kwargs)...: print(result)...: return decorated_functionIn [11]: @trace...: def greet(greeting, name):...: return '{}, {}!'.format(greeting, name)
In [14]: greet('Hello', 'Bob')
<function greet at 0x7fefa69db700> ('Hello', 'Bob') {}
Hello, Bob!
使用像这样的技术,有时很难在使代码足够明确的想法和遵守不要重复自己(DRY)原则的想法之间取得平衡。
这可能永远是一个艰难的选择。如果你能从同事那里得到第二个意见,我鼓励你尝试一下。
推荐文章
李宏毅《机器学习》国语课程(2022)来了
有人把吴恩达老师的机器学习和深度学习做成了中文版
上瘾了,最近又给公司撸了一个可视化大屏(附源码)
如此优雅,4款 Python 自动数据分析神器真香啊
梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学
香的很,整理了20份可视化大屏模板
技术交流
完整代码、数据获取,可以找我来要
目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
- 方式①、发送如下图片至微信,长按识别,后台回复:加群;
- 方式②、添加微信号:dkl88191,备注:来自CSDN
- 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
技术交流、求职内推、干货汇总、与 3000+来自阿里、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
Python技巧:args 和 kwargs 原来这么强大相关推荐
- python中*args和**kwargs的使用
文章来源:*Args和**kwargs的使用[重复] - 代码领悟code05.com 提问:python中*args和**kwargs的使用 所以我对*args和**kwargs的概念有困难. 到目 ...
- python 中*args 和 **kwargs的区别
*args的用法 当你不确定你的函数里将要传递多少参数时你可以用*args.例如,它可以传递任意数量的参数: def print_everything(*args):for count, thing ...
- Python中*args和**kwargs的区别
https://www.cnblogs.com/yunguoxiaoqiao/p/7626992.html (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 中秋的夜,微凉, ...
- Python中*args 和**kwargs的用法探讨
当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.不确定的意思可以是有,有几个,也可以是没有 *args可以当作可容纳多个变量组成的l ...
- 【Python】Python中*args 和**kwargs的用法
好久没有学习Python了,应为工作的需要,再次拾起python,唤起记忆. 当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. 还是 ...
- Python中*args 和**kwargs的用法
刚开始学习python的时候,对有关args,kwargs,和*的使用感到很困惑.相信对此感到疑惑的人也有很多.我打算通过这个帖子来排解这个疑惑(希望能减少疑惑). 让我们通过以下5步来理解: 1. ...
- Python中*args和**kwargs
*一.args的使用方法 *args 用来将参数打包成tuple给函数体调用 def fun(*arg):print(arg,type(arg))print(*arg) fun(1,2,[8,9]) ...
- 详解Python的*args和 **kwargs
*args表示任何多个无名参数,它是一个tuple:**kwargs表示关键字参数,它是一个dict. def fun(*args, **kwargs):print 'args = ', argspr ...
- Python : *args和**kwargs是什么东东呢?
def foo(*args, **kwargs):print 'args = ', argsprint 'kwargs = ', kwargsprint '---------------------- ...
最新文章
- 软件设计原则——合成复用原则
- 一些实用的DBA语句之二(慢慢更新)
- vue的双向绑定原理及实现
- 了解ThreadLocal背后的概念
- Win10系统省电模式的设置教程
- 用于创建此对象的程序是package_【ROS 学习笔记】CMakeLists.txt 与 package.xml
- 算法移植优化(三)android dlib 人脸检测使用
- 2017.3.18 每日小记
- Bridge的VLAN接口模式
- 计算机管理设置透明,教你把win10任务栏透明设置
- Ubuntu无法联网解决方案
- 统计学习之第四天(可汗学院公开课:统计学)
- 006Python-Re库入门(正则表达式)
- 区块链技术在创造共享经济方面胜过互联网
- 大量STATSPACK数据统计分析
- 10_OpenCV读取原始raw(raw10和raw8),转换成rgb和灰度图,并显示
- 为什么说串行比并行速度快?
- 打开window常用程序快捷命令
- 木兰天池全新景观2013闪亮登场
- NVIDIA CUDA Toolkit 各个版本安装方式