Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python *(单星)和/(斜线)作为独立参数做什么?_Python_Python 3.x_Function - Fatal编程技术网

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

Python *(单星)和/(斜线)作为独立参数做什么?,python,python-3.x,function,Python,Python 3.x,Function,在以下函数定义中,*和/说明了什么 def func(self, param1, param2, /, param3, *, param4, param5): print(param1, param2, param3, param4, param5) 注意:为了避免与*args |**kwargs()中的单|双星号错误,如中所述,斜杠仅用于位置参数,如文档所述: 有一个新的函数参数语法/,表示某些函数参数必须按位置指定,不能用作关键字参数。这与使用Larry Hastings工具注释

在以下函数定义中,*/说明了什么

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)
注意:为了避免与*args |**kwargs()

中的单|双星号错误,如中所述,斜杠仅用于位置参数,如文档所述:

有一个新的函数参数语法
/
,表示某些函数参数必须按位置指定,不能用作关键字参数。这与使用Larry Hastings工具注释的C函数的
help()
所示的符号相同

对于星号,它在以下文件中提到:

对于具有默认值的参数,可以从调用中省略相应的参数,在这种情况下,将替换该参数的默认值。如果参数具有默认值,则在“
*
”之前的所有后续参数都必须具有默认值-这是语法未表达的语法限制


因此,将其称为:

obj.func(10, 20, 30, param4=50, param5=60)
以及:

有一个
/
指示某些函数参数必须按位置指定,不能用作关键字参数。[这在
Python 3.8
中是新的]

文档指定了

  • 它允许纯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
    
  • 另一个用例是当参数 这个名字没有帮助。例如,内置的
    len()
    函数 签名
    len(obj,/)
    。这排除了尴尬的呼叫,例如:

    len(obj='hello')  # The "obj" keyword argument impairs readability
    
  • 将参数标记为仅位置参数的另一个好处是 它允许将来更改参数名称,而无需 破坏客户端代码的风险。例如,在统计模块中, 参数名称dist将来可能会更改。这是我做的 可使用以下功能规格:

    def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    
  • 其中as
    *
    用于强制执行。命名参数的用例之一

    所以,根据这个方法,

    def func(self, param1, param2, /, param3, *, param4, param5):
         print(param1, param2, param3, param4, param5)
    
    它一定是用

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

  • param1
    ,必须指定
    param2
  • param3
    可以使用或调用
  • 必须使用参数调用
    param4
    param5
  • 演示:


    /
    是代表,而
    *
    是代表。请参阅:尼斯;你知道重点是什么吗?为什么要这样限制用户自由?@Charanor查看设计和实现此功能的人员考虑的原因。你认为这些理由是否有说服力取决于你;我个人认为这两种方法都可以。
    /
    操作符是否只适用于左参数?你的描述似乎不清楚,但我可能看错了。@GammaGames:是的。参数的顺序始终是仅位置的
    /
    位置的或仅关键字的
    *
    关键字的。
    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)
    
    >>> 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
    ... )