仅位置参数
positionalonl的Python项目详细描述
仅位置参数/参数
模块以伪造仅位置参数(PEP 497,草稿)。
以下面的函数为例:
defdiff(left,right,context=3):'''print the diff between `left` and `right` with `context` '''...
right和left现在是api的一部分,用户可以决定 使用diff(left=str1, right=str1),阻止API更改,因此您不能 更改参数的名称,例如 def diff(old, new, context=3)不使用c-api。
这个模块提供了一个decorator@positionally,使 函数的默认参数较少,因此您可以 写入:
@positionalonly def diff(left, right, context=3): ...
usingit like将引发一个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)
仅使用位置的原因
参数的命名,特别是函数签名可以是 帮助完成制表符和静态分析以理解代码。 虽然posistional只能使用*args,但它隐藏了所有这些 来自人类和计算机的信息。
python的默认行为是通过dafult、positional 关键字。
这个事实经常阻止开发人员在没有 打破API。
这还可以防止任意的**kwargs键被 “位置或关键字”参数。