赞
踩
有人能解释我为什么需要这种“头痛”......
对于您的具体示例,似乎没有任何仅限关键字的参数。相反,你试图传递第一,第二和第四个参数的参数,而不必传递你不关心的参数之间的参数。
换句话说,这根本不是头疼。这是一个你很容易忽视的便利(和理智检查) - 但可能不想。
而不是这个:PatternFill('FFFFFF', 'FFFFFF', fill_type='solid')
......你可以这样写:PatternFill('FFFFFF', 'FFFFFF', Color(), 'solid')
...但是为了知道您需要发送的内容,您需要阅读源或文档以查看整个参数列表,并查看要跳过的参数的默认值,并明确添加它们给你打电话。
我怀疑有人会发现更好。
此外,正如多个人在评论中指出的那样,这几乎就是命名参数在C#中的作用。
而这个类是,一不小心,为什么Python中实际上是一个很好的例子,也只允许关键字参数,即使他们没有被用在这里。
事实上,你可以写,PatternFill('FFFFFF', 'FFFFFF', 'solid')而不是得到一个TypeError不好的参数PatternFill,但相反,一个关于'solid'不作为颜色工作的神秘错误,这不是一件好事。并且(至少没有类型暗示注释,这种类型没有),你的IDE或任何其他工具都无法捕捉到这个错误。
事实上,通过不使用关键字,你甚至没有意识到错误的初始论点。你几乎肯定想要这样做:PatternFile(None, 'FFFFFF', 'FFFFFF')
...但你没有明显错误就逃脱了:PatternFile('FFFFFF', 'FFFFFF')
...这意味着您将前景色作为图案类型传递,将背景色作为前景色并保留默认背景色。
这可以通过使所有或大多数参数仅限关键字来解决。但是,如果没有仅限关键字的参数,唯一的选择就是**kwargs,并且这种权衡通常是不值得的。
引用PEP 3102的基本原理,该提议为该语言添加了仅限关键字的参数:通常情况下,函数需要采用可变数量的参数。Python语言使用'varargs'语法(* name)支持这一点,该语法指定任何'遗留'参数作为元组传递给varargs参数。
对此的一个限制是,目前,必须在vararg插槽之前填充所有常规参数槽。
这并不总是令人满意的。人们可以很容易地设想一个带有可变数量参数的函数,但也可以以关键字参数的形式获取一个或多个“选项”。目前,唯一的方法是定义一个varargs参数和一个'keywords'参数(**kwargs),然后从字典中手动提取所需的关键字。
如果不明显为什么使用*args并且**kwargs不够好:查看源,内联help或自动生成的文档中的函数定义时,函数的实际签名不可见。
使用inspect模块或类似物的动态反射代码也不能使用签名。
该签名也不适用于静态反射代码,类似于许多IDE用于完成和建议的代码。
该功能的实现是不太清楚,因为充其量是半样板用于提取和测试参数,在最坏的情况将args和kwargs访问分散在整个函数体。
有关此功能允许的示例,请考虑内置print函数,您可以像这样调用:print(x, y, z, sep=', ')
这是因为print定义如下:print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False):
如果它不是用于关键字参数,则无法将其sep作为与要打印的实际值不同的内容传递。
你可以强制用户传递一个元组中的所有对象而不是单独的参数,但这样会更不友好 - 即使你这样做了,flush没有传递所有值的值也没有办法传递sep,end和file。
而且,即使使用关键字参数,如果它不是仅用于关键字的参数,那么函数签名必须如下所示:print(*objects, **kwargs):
...这会让你更难弄清楚你可以传递什么关键字参数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。