跳转到主要内容

位置参数仅支持参数

项目描述

位置参数仅支持参数

模拟位置参数(pep 497,草案)的模块。

以下函数作为示例:

def diff(left, right, context=3):
'''print the diff between `left` and `right` with `context`
'''
...

现在,right和left是API的一部分,用户可以选择使用diff(left=str1, right=str1),阻止API更改,因此不能更改参数的名称,例如使用C-api而不更改名称为def diff(old, new, context=3)。

此模块提供了一个装饰器@positionalonly,使您的函数中所有无默认值的参数都成为位置参数,因此您可以编写

@positionalonly
def diff(left, right, context=3):
...

使用它将引发TypeError,并且函数签名将使用位置参数语法,类似于pep 497中的/。

>>> diff(right="bar", left="foo")
TypeError: The following parameters of `diff` are positional only.
They were used as keywords arguments:
- 'right' ('bar') should be in 2nd position
- 'left' ('foo') should be in 1st position

>>> help(diff)
Help on function diff in module __main__:

diff(left, right, /, context=3)

高级用法

默认情况下,positionalonly将在第一个具有默认值的参数之前将位置参数和其他参数之间的限制设置为。您可以传递一个整数作为参数,指示要使其成为位置参数的参数数量来调整此行为

>>> @positionalonly(3)
... def diff(old, new, context=3)
... pass

>>> signature(diff)
diff(left, right, context=3, /)


>>> @positionalonly(1)
... def diff(old, new, context=3)
... pass

>>> signature(diff)
diff(left, /, right, context=3)

如果您太懒了或害怕计数错误,positionalonly也会将限制设置为第一个具有默认值positionalonly本身的参数。

>>> @positionalonly
... def diff(old, new, end=positionalonly, context=3)
... pass

>>> signature(diff)
diff(left, right, /, context=3)

>>> pos_or_kw
>>> @positionalonly
... def diff(old, start=pos_or_kw, context=3)
... pass

>>> signature(diff)
diff(left, /, right, context=3)

使用位置参数的原因

参数命名,特别是函数签名对于tab补全和静态分析以理解代码很有帮助。虽然位置参数可以通过*args使用,但它会从人类和计算机那里隐藏所有这些信息。

Python的默认行为是使参数默认、位置和关键字。

这一事实经常阻止开发人员在不破坏API的情况下更改名称。

这也可以防止任意 **kwargs 键,因为它们会被“位置或关键字”参数所占用。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。

源代码分发

此版本没有提供源代码分发文件。请参阅有关 生成分发存档 的教程。

构建分发

positionalonly-0.0.3-py3-none-any.whl (71.1 kB 查看哈希值)

上传时间 Python 3

支持