Python之位置限定参数

介绍 Python 3.8 中的新语法 /。

在函数中使用 / 标记来指明位置限定参数,是即将发布的 Python 3.8 中诸多新改进之一。引入的这种语法更具性能优势,同时可以实现更好的 API 设计。我们来看看引入位置限定参数背后的动机,并举例说明如何使用。

背景

Python 中已经使用 * 标记提供了关键字限定参数,而使用 / 标记来支持的位置限定参数,还可以提高语言的一致性。对于位置或关键字参数,并不一定要限制将其混合使用。看看这些例子:

  • 一些函数的参数有具体含义:namedtuple(typenames, field_names, …)
  • 函数中没有实际意义的参数名,如 min() 函数的参数名:arg1,arg2 等

如果用户已经使用了关键字参数,那么库作者则无法重命名这些参数,因为这会是一个破坏性变更。以 min() 函数为例,参数的名称没有实际的意义,且强制作者永远维持这个名称不变,因为调用者可能会将参数名作为关键字传入。这个问题可以通过使用位置限定参数来解决。此外,位置限定参数的解析和处理还更快一些。

如何使用位置限定参数

指定参数作为位置限定参数,/ 标记必须位于函数定义中被限定的参数之后。

举个例子:

Python之位置限定参数

稍后我们调用这个函数:

  • 所有位于 / 左边的参数(这个例子中是 x 和 y)只能按位置传入。
  • mod 可以按位置或关键字的方式传入。

Python之位置限定参数

另外一个例子:

Python之位置限定参数

  • 如果一个位置限定参数指定了默认值,那么在它后面的位置限定参数以及其它的位置限定参数或关键字参数同样需要指定默认值(如本例中的 prettify)。
  • 未指定默认值的位置限定参数为必传的(required)位置限定参数(如本例中的 items)。

一般情况

一个具有多种参数传递方式的函数定义如下:

Python之位置限定参数

什么时候使用位置限定参数

  • 如果参数名不重要或者没有实际意义,并且只有少量参数,且一直按照既定的顺序传入时,使用位置限定参数。
  • 如果参数名有实际意义,并且需要显式命名来增加函数定义的可理解性,使用关键字限定参数。

位置限定参数于 PEP 570 提案中被提出,如果希望更详细地了解其功能,可以读一读该提案。

英文原文:https://deepsource.io/blog/python-positional-only-arguments/

译者:居老师的龙尾巴

相关推荐