*(单星)和/(劈开)作为独立参数有什么作用? [英] What do * (single star) and / (slash) do as independent parameters?

查看:48
本文介绍了*(单星)和/(劈开)作为独立参数有什么作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在以下函数定义中,*/占什么位置?

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)

注意:不要混淆*args|**kwargs(solved here)

中的单|双星号

推荐答案

new function parameter syntax/指示某些函数参数必须位置指定,不能用作关键字参数。[这是Python 3.8]

中的新增内容

文档指定了positional-only parameters

的一些使用情形/优势
  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
    
  2. 另一个用例是当参数 名字无济于事。例如,内置len()函数具有 签名len(obj, /)。这就避免了诸如:

    之类的尴尬呼叫
    len(obj='hello')  # The "obj" keyword argument impairs readability
    
  3. 将参数标记为仅位置的另一个好处是 它允许将来更改参数名称,而不需要 有破坏客户端代码的风险。例如,在统计模块中, 参数名称dist将来可能会更改。这是做好的 可能具有以下功能规范:

    def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    

其中AS*用于强制caller to use named argumentsThis is命名参数的用例之一。

因此,给定的方法

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)

必须用

调用
obj.func(10, 20, 30, param4=50, param5=60)

obj.func(10, 20, param3=30, param4=50, param5=60)

ie,

  1. param1param2必须指定positionally
  2. param3可以用positionalkeyword调用。
  3. param4param5必须使用keyword参数调用。

演示:

>>> 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
... )

这篇关于*(单星)和/(劈开)作为独立参数有什么作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆