当 help() 列出方法签名时,斜线代表什么意思?

2024-12-13 08:36:00
admin
原创
132
摘要:问题描述:/Python 3.4 的help输出中range右括号之前的含义是什么?>>> help(range) Help on class range in module builtins: class range(object) | range(stop) -> range...

问题描述:

/Python 3.4 的help输出中range右括号之前的含义是什么?

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

                                        ...

解决方案 1:

它标志着仅位置参数的结束,这些参数不能用作关键字参数。在 Python 3.8 之前,此类参数只能在 C API 中指定。

这意味着key参数__contains__只能通过位置()传入range(5).__contains__(3),而不能作为关键字参数(range(5).__contains__(key=3)),在纯 Python 函数中使用位置参数可以做到这一点。

另请参阅Argument Clinic文档:

要在 Argument Clinic 中将所有参数标记为仅位置参数,请/在最后一个参数后单独添加一行,缩进与参数行相同。

以及(最近添加的)Python FAQ:

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

从 3.8 版开始,该语法已成为 Python 语言规范的一部分,请参阅PEP 570 – Python 仅位置参数。在 PEP 570 之前,该语法已保留,以便将来可能纳入 Python,请参阅PEP 457 -仅位置参数的语法

位置专用参数可以带来更干净、更清晰的 API,使纯 Python 实现的 C 模块更加一致且更易于维护,而且由于位置专用参数几乎不需要处理,因此可以生成更快的 Python 代码。

解决方案 2:

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

替代方案:使用 '/' 怎么样?它与 '*' 相反,表示“关键字参数”,并且 '/' 不是一个新字符。

随后他的提议获得胜利。

呵呵。如果这是真的,我的 '/' 提议就获胜了:

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

我认为与此相关的文档是PEP 570。其中的回顾部分看起来不错。

回顾

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

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

作为指导:

如果名称无关紧要或没有意义,并且只有少数参数始终以相同顺序传递,则使用仅位置函数。如果名称有意义,并且使用名称明确函数定义更易于理解,则使用仅关键字函数。


如果函数以/

def foo(p1, p2, /)

这意味着所有功能参数都是位置相关的。

解决方案 3:

正斜杠 (/) 表示其之前的所有参数都是位置唯一参数。位置唯一参数功能是在PEP 570被接受后在 Python 3.8 中添加的。最初,此表示法是在PEP 457 - 位置唯一参数表示法中定义的

函数定义中前斜杠 (/) 之前的参数仅用于定位,后跟斜杠 (/) 的参数可以根据语法为任意类型。调用函数时,参数仅根据其位置映射到位置参数。通过关键字 (name) 传递位置参数是无效的。

让我们来看下面的例子

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仅接受一个位置(唯一)参数,如果将 len 调用为 len(obj="hello world") 会降低可读性,请查看 help(len)。

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

仅定位参数使底层 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。查看新增内容 python3.8 - 仅位置参数

PEP 相关:PEP 570——Python 仅位置参数

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用