Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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 help()输出中的斜杠是什么意思?_Python_Python 3.x_Parameters_Introspection - Fatal编程技术网

Python help()输出中的斜杠是什么意思?

Python help()输出中的斜杠是什么意思?,python,python-3.x,parameters,introspection,Python,Python 3.x,Parameters,Introspection,在Python3.4的帮助中,在结束括号之前的范围的输出中,/是什么意思 >>> help(range) Help on class range in module builtins: class range(object) | range(stop) -> range object | range(start, stop[, step]) -> range object | | Return a virtual sequence of numb

在Python3.4的
帮助
中,在结束括号之前的
范围
的输出中,
/
是什么意思

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return a virtual sequence of numbers from start to stop by step.
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.

                                        ...

它表示参数的结束,您不能将其用作关键字参数。在Python3.8之前,此类参数只能在C API中指定

这意味着
key
参数只能通过位置(
范围(5).\uu包含\uuu3)
)传递,而不能作为关键字参数(
范围(5).\uu包含\uuu3)
),这是纯python函数中可以使用位置参数的

另请参见文档:

要在参数诊所中将所有参数标记为仅位置参数,请在最后一个参数后的一行上添加一个与参数行缩进相同的
/

以及(最近添加的)以下内容:

函数参数列表中的斜杠表示其前面的参数仅为位置参数。仅位置参数是没有外部可用名称的参数。在调用只接受位置参数的函数时,参数仅根据其位置映射到参数

语法现在是Python语言规范的一部分,请参阅。在PEP 570之前,该语法已经保留下来,以便将来可能包含在Python中,请参阅


仅位置参数可以带来更干净、更清晰的API,使纯Python的纯C模块实现更一致、更易于维护,而且因为仅位置参数只需要很少的处理,所以它们可以带来更快的Python代码。

我自己问过这个问题。:)发现
/
最初是由Guido在年提出的

备选方案:使用“/”怎么样?有点相反 “*”表示“关键字参数”,而“/”不是新字符

然后是他的提议

呵呵。如果这是真的,我的“/”提案将获胜:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

我认为涉及这一点的非常相关的文件是。 重述部分看起来不错

重述

用例将决定在函数定义中使用哪些参数:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
作为指导:

仅当名称无关紧要或没有意义,并且只有几个参数始终按相同顺序传递时,才使用位置参数。 仅当名称有意义且函数定义更易于理解时才使用关键字


如果函数以
/

def foo(p1, p2, /)
这意味着所有函数参数都是位置参数

正斜杠(/)表示它前面的所有参数都是位置参数。Python3.8接受后添加了仅位置参数特性。最初,该符号是在中定义的

函数定义中斜杠(/)前面的参数仅为位置参数,斜杠(/)后面的参数可以是任何类型的参数。其中,参数仅根据调用函数时的位置映射到位置参数。按关键字(名称)传递仅位置参数无效

让我们举下面的例子

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)
在上述函数定义中,参数a和b仅为位置参数,而x或y可以是位置参数或关键字参数

以下函数调用是有效的

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")
但是,以下函数调用无效,这会引发异常TypeError,因为a、b不是作为位置参数传递的,而是作为关键字传递的

foo(a=1.45, b=3.14, x=1, y=4)
TypeError:foo()获取了一些仅作为关键字传递的位置参数 论点:“a,b”

python中的许多内置函数只接受位置参数,而按关键字传递参数是没有意义的。例如,内置函数len只接受一个位置(only)参数,如果将len调用为len(obj=“hello world”)会损害可读性,请检查帮助(len)

仅位置参数使底层c/库函数易于维护。它允许在将来更改仅位置参数的参数名称,而不会破坏使用API的客户端代码

最后但并非最不重要的一点是,仅位置参数允许我们在可变长度关键字参数中使用它们的名称。检查下面的示例

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
此处更好地解释了仅位置参数

python3.8正式添加了仅位置参数语法。结帐


PEP相关:

选择
/
标记,因为“这是
*
的反向操作”表明Python有点疯狂。这是一种联觉。
>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}