返回介绍

Python 3.0 Keyword-Only 参数

发布于 2024-01-29 22:24:16 字数 2418 浏览 0 评论 0 收藏 0

Python 3.0把函数头部的排序规则通用化了,允许我们指定keyword-only参数——即必须只按照关键字传递并且不会由一个位置参数来填充的参数。如果想要一个函数既处理任意多个参数,也接受可能的配置选项的话,这是很有用的。

从语法上讲,keyword-only参数编码为命名的参数,出现在参数列表中的*args之后。所有这些参数都必须在调用中使用关键字语法来传递。例如,在如下的代码中,a可能按照名称或位置传递,b收集任何额外的位置参数,并且c必须只按照关键字传递:

我们也可以在参数列表中使用一个*字符,来表示一个函数不会接受一个变量长度的参数列表,而是仍然期待跟在*后面的所有参数都作为关键字传递。在下一个函数中,a可能再次按照位置或名称传递,但b和c必须按照关键字传递,不允许其他额外的位置传递:

仍然可以对keyword-only参数使用默认值,即便它们出现在函数头部中的*的后面。在下面的代码中,a可能按照名称或位置传递,而b和c是可选的,但是如果使用的话必须按照关键字传递:

实际上,带有默认值的keyword-only参数都是可选的,但是,那些没有默认值的keyword-only参数真正地变成了函数必需的keyword-only参数:

排序规则

最后,注意keyword-only参数必须在一个单个星号后面指定,而不是两个星号——命名的参数不能出现在**args任意关键字形式的后面,并且一个**不能独自出现在参数列表中。这两种做法都将产生语法错误:

这意味着,在一个函数头部,keyword-only参数必须编写在**args任意关键字形式之前,且在*args任意位置形式之后,当二者都有的时候。无论何时,一个参数名称出现在*args之前,它可能是默认位置参数,而不是keyword-only参数:

实际上,在函数调用中,类似的排序规则也是成立的:当传递keyword-only参数的时候,它们必须出现在一个**args形式之前。keyword-only参数可以编写在*args之前或者之后,并且可能包含在**args中:

请自行分析这些情况,结合前面正式介绍的一般的参数排序规则。在这些人为编写的例子中,它们可能是最糟糕的情况,但是,在实际中有可能会遇到它们,特别是那些编写库和工具供其他Python程序员使用的人。

为何使用keyword-only参数

那么,为什么要关心keyword-only参数?简而言之,它们使得很容易允许一个函数既接受任意多个要处理的位置参数,也接受作为关键字传递的配置选项。尽管它们的使用是可选的,没有keyword-only参数的话,要为这样的选项提供默认值并验证没有传递多余的关键字则需要额外的工作。

假设一个函数处理一组传入的对象,并且允许传递一个跟踪标志:

没有keyword-only参数的话,我们必须使用*args和**args,并且手动地检查关键字,但是,有了keyword-only参数,需要较少的代码。下面的语句通过notify保证不会有位置参数错误匹配,并且要求它如果传递则作为一个关键字传递:

在本章后面“模拟Python 3.0 print函数”一节中,我们将继续看到一些更实用的例子,我们将在那里介绍剩下的内容。参阅本书第20章的迭代选项计时案例,那里给出了keyword-only参数用法的另一个例子。对于Python 3.0中的额外函数定义扩展,第19章将讨论函数注解语法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文