*(单星)和/(斜线)作为独立参数有什么作用?

iba*_*ond 47 python function parameter-passing function-parameter python-3.x

在下面的函数定义中,*/代表什么?

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)
Run Code Online (Sandbox Code Playgroud)

注意:不要误认为 *args | 中的单|双星号 **kwargs(在这里解决

Abd*_*P M 51

有一个新的函数参数语法 /来指示某些函数参数必须在位置上指定并且不能用作关键字参数。[这是新的Python 3.8]

文档指定了Positional-only 参数的一些用例/好处

  1. 它允许纯 Python 函数完全模拟现有 C 编码函数的行为。例如,内置pow() 函数不接受关键字参数:

    def pow(x, y, z=None, /):
        "Emulate the built in pow() function"
        r = x ** y
        return r if z is None else r%z
    
    Run Code Online (Sandbox Code Playgroud)
  2. 另一个用例是在参数名称没有帮助时排除关键字参数。例如,内置len()函数具有签名len(obj, /)。这排除了尴尬的调用,例如:

    len(obj='hello')  # The "obj" keyword argument impairs readability
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将参数标记为仅位置参数的另一个好处是它允许将来更改参数名称而不会破坏客户端代码的风险。例如,在统计模块中,参数名称 dist 将来可能会更改。这是通过以下功能规范实现的:

    def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
    Run Code Online (Sandbox Code Playgroud)

其中 as*用于强制调用者使用命名参数这是命名参数的用例之一。

所以,给定方法,

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)
Run Code Online (Sandbox Code Playgroud)

它必须用

obj.func(10, 20, 30, param4=50, param5=60)
Run Code Online (Sandbox Code Playgroud)

或者

obj.func(10, 20, param3=30, param4=50, param5=60)
Run Code Online (Sandbox Code Playgroud)

IE,

  1. param1,param2必须在位置上指定。
  2. param3可以使用positionalkeyword调用。
  3. param4并且param5必须使用关键字参数调用。

演示:

>>> class MyClass(object):
...     def func(self, param1, param2, /, param3, *, param4, param5):
...         return param1, param2, param3, param4, param5
...
>>> obj = MyClass()
>>>
>>> assert obj.func(10, 20, 30, param4=40, param5=50), obj.func(
...     10, 20, param3=30, param4=40, param5=50
... )
Run Code Online (Sandbox Code Playgroud)

  • @Charanor 请参阅 https://www.python.org/dev/peps/pep-0570/#rationale 了解设计和实现此功能的人员考虑的原因。您是否认为这些是令人信服的理由取决于您;我个人可以以任何一种方式争论。 (4认同)
  • @GammaGames:是的。参数的顺序始终是仅位置 `/` 位置或关键字 `*` 仅关键字。 (4认同)
  • “/”运算符仅适用于左侧参数吗?你的描述对我来说似乎不太清楚,但我可能读错了。 (3认同)

U10*_*ard 6

正如文档中提到的,斜杠仅用于位置参数,如文档所述:

\n\n
\n

有一种新的函数参数语法,/指示某些函数参数必须按位置指定,并且不能用作关键字参数。help()这与使用 Larry Hastings\xe2\x80\x99 Argument Clinic工具注释的 C 函数显示的符号相同。

\n
\n\n

对于星号,文档中提到了:

\n\n
\n

对于具有默认值的参数,可以在调用中省略相应的参数,在这种情况下,parameter\xe2\x80\x99s 默认值将被替换。如果一个参数有默认值,则所有后续参数直到 \xe2\x80\x9c *\xe2\x80\x9d 也必须有一个默认值 \xe2\x80\x94 这是一个语法限制,不能用语法来表达。

\n
\n\n
\n\n
def func(self, param1, param2, /, param3, *, param4, param5):\n     print(param1, param2, param3, param4, param5)\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以调用它的方法是:

\n\n
obj.func(10, 20, 30, param4=50, param5=60)\n
Run Code Online (Sandbox Code Playgroud)\n\n

和:

\n\n
obj.func(10, 20, param3=30, param4=50, param5=60)\n
Run Code Online (Sandbox Code Playgroud)\n