原标题: 不要再乱用 *args 和 **kwargs 啦 (Python)
来源:AI 研习社 链接:https://www.yanxishe.com/TextTranslation/2407
网上有很多教程,目的是教你在用Python定义函数时如何使用*args和**kwargs。也许你已经花了好几个小时想办法释放他们的潜能。也许,经过这么多的研究,你现在对他们有信心了。
不要掉以轻心
强大工具通常伴随着危险,虽然他们可以让你轻松些,但记住我的话,它可能会影响你后续的步骤。
为什么呢?
一些基本知识
Python函数中的参数可以接受两种类型的参数:
1、按位置传递的位置参数。
2、关键字提供的关键字参数。
def foo(start, end):
print(start, end)
例如,foo('Hi',end='Bye!')提供位置参数“Hi”和关键字参数“Bye!”使用关键字end to function foo。函数的参数是预先定义的;函数中接受的参数数是固定的。然而,情况并非总是如此。
*args允许您向函数传递任意数量的位置参数。星号*是一个解包参数。它们在函数中打包为一个iterable元组。
另一方面,kwargs允许向函数传递不同数量的关键字参数。由于每个关键字参数都有一个关键字和一个值,因此它在函数中被分组为一个iterable字典。
图片来自 Unsplash的 Susan Holt Simpson
问题
在大多数情况下,您不需要*args和**kwargs。您多久不知道一个预定义函数应该接收多少个参数?
如果您滥用代码,则很难调试代码,因为您正在将任意数量的参数传递给函数,并且函数可能具有不可预知的行为。
显式比隐式好。-python之禅
什么时候用?
简而言之:在你真正需要的时候使用它们。例如,一个有很多可选字段的函数,其中一些只在某些情况下使用。例如,一个函数绘制一个图形,您可以传递各种可选参数来修改其颜色、样式、大小等。
每次使用*args和/或**kwargs时,请确保文档非常清晰,以避免混淆。
有一种情况下,它们的使用可能是不可避免的。如果要为具有未知参数的函数创建包装器,则必须接受任意数量的位置参数和关键字参数,然后将它们传递给函数。
例如,Python中的decorators作为包装器工作,可以在不更改函数代码本身的情况下更改代码的行为,从而增加额外的功能。
在下面的例子中,我们构建了一个trace函数,它打印出执行函数的名称作为一个全面的检查。decorator被应用到函数的顶部,使用@trace,如下所示。因为我们想将这个decorator应用于任何带有任意数量参数的函数,所以我们需要使用*args和**kwargs。
说明
可以的话,尽量不要使用*args和**kwargs。
需要注意,args和kwargs不过是默认的命名,你可以随意更改这些变量名,真正起作用的是星号*和**。
感谢你的阅读!如果你想进一步提高Python技能,以下文章可能会有所帮助:
一THE END一
免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com