python中怎么输入参数,Python函数中的输入参数

Can someone explain me why we need this "headache"…

对于您的特定示例,似乎没有任何仅限关键字的参数。相反,您尝试传递第一个、第二个和第四个参数的参数,而不必为您不关心的参数传递参数。在

换句话说,这一点也不头疼。这是一个方便(和健全性检查)你可以很容易忽视,但可能不想。在

而不是这样:PatternFill('FFFFFF', 'FFFFFF', fill_type='solid')

…你可以写下:

^{pr2}$

…但是为了让知道您需要发送的内容,您需要阅读源代码或文档以查看整个参数列表,并查看要跳过的参数的默认值,然后显式地将它们添加到调用中。在

我怀疑有人会觉得更好。在

另外,正如许多人在评论中指出的,这几乎就是命名参数在C#中的工作方式。在

意外地,这个类是一个很好的例子,说明了为什么Python实际上允许只使用关键字的参数,尽管这里没有使用它们。在

事实上,您可以编写PatternFill('FFFFFF', 'FFFFFF', 'solid')而不会因为PatternFill的错误参数而得到TypeError,而是一个关于{}不能作为颜色工作的神秘错误,这并不是一件好事。而且(至少在没有类型暗示注释的情况下,这种类型没有),您的IDE或任何其他工具都无法捕捉到这个错误。在

而且,事实上,如果不使用关键字,你甚至会在没有意识到的情况下,把初始参数弄错了。你几乎肯定想这么做:PatternFile(None, 'FFFFFF', 'FFFFFF')

…但是你没有发现一个明显的错误:PatternFile('FFFFFF', 'FFFFFF')

…这意味着您将前景色作为图案类型传递,背景色作为前景色传递,而保留默认背景色。在

这可以通过使所有或大多数参数关键字只。但是如果没有关键字参数,唯一的选择就是**kwargs,而且这种折衷通常是不值得的。在

引用PEP 3102的基本原理,建议在语言中添加仅关键字参数:There are often cases where it is desirable for a function to take a variable number of arguments. The Python language supports this using the 'varargs' syntax (*name), which specifies that any 'left over' arguments be passed into the varargs parameter as a tuple.

One limitation on this is that currently, all of the regular argument slots must be filled before the vararg slot can be.

This is not always desirable. One can easily envision a function which takes a variable number of arguments, but also takes one or more 'options' in the form of keyword arguments. Currently, the only way to do this is to define both a varargs argument, and a 'keywords' argument (**kwargs), and then manually extract the desired keywords from the dictionary.

如果不清楚为什么使用*args和**kwargs不够好:当查看源代码中的函数定义、内联help、或自动生成的文档时,函数的实际签名不可见。在

签名对于使用inspect模块或类似模块的动态反射代码也不可用。在

签名对于静态反射代码也不可用,比如许多ide用来完成和建议的代码。在

函数的实现就不那么清晰了,因为它充其量只是提取和测试参数的半样板文件,而在最坏的情况下,args和{}访问分散在函数体中。在

关于此功能允许的示例,请考虑内置的^{}函数,可以这样调用:print(x, y, z, sep=', ')

这是因为print的定义如下:print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False):

如果不是关键字参数,就没有办法将sep作为与实际打印值不同的内容来传递。在

您可以强制用户在一个元组中传递所有对象,而不是作为单独的参数,但是这样做的友好性要差得多,即使这样做了,也无法传递flush而不传递所有{}、end和{}的值。在

而且,即使使用关键字参数,如果不是仅关键字参数,函数签名也必须如下所示:print(*objects, **kwargs):

…这会让你很难找出你能传递什么样的关键字参数。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值