Python函数定义中的裸斜杠? [复制]

Posted

技术标签:

【中文标题】Python函数定义中的裸斜杠? [复制]【英文标题】:Bare forward slash in Python function definition? [duplicate] 【发布时间】:2019-10-24 03:22:03 【问题描述】:

在Python 3.8 Programming FAQ中看到了如下函数定义:

class callByRef:
    def __init__(self, /, **args):
        for key, value in args.items():
            setattr(self, key, value)

the Python 3.7 version 中缺少此内容:

class callByRef:
    def __init__(self, **args):
        for (key, value) in args.items():
            setattr(self, key, value)

这个新的/ 语法是什么?

它与出现在help() 输出中的/ 有什么关系?


注意:this 和 this 问题是关于 help() 注释,而这个问题是关于新语法以及与 help() 注释的任何差异。

【问题讨论】:

相关:Bare asterisk in function arguments? 人们不仔细阅读。这不是骗子。投票真的很奇怪。 @Sanyash 1) 两篇文章都描述了相同的行为,所以这篇文章除了说“现在它在语义上也得到了执行”之外几乎没有什么价值,2) python3.8 仍在积极开发中,并且在十月之前不会发布 RC。所以谈论它的状态(而不是 PEP)是个坏主意 @Arne 我不同意。 1) 在 3.8 之前,我们不能用/ 编写纯 Python 函数。它只是 C API 功能。现在我们可以了。我不能说这是相同的行为。这是一个很大的变化。 2) 这篇文章比任何“给我代码”问题、“调试我的代码”问题等都更有价值。 3) imo 不是一个坏主意。这个问题不是假设性的。 @Sanyash 他们仍然描述了相同的行为......这就是我所说的。骗子很好,特别是this one 真的很好。我从来没有说过这个问题是假设性的,我说讨论一个甚至没有发布的功能是个坏主意。特别是在这个 QA 表单中。 【参考方案1】:

语法介绍

/ as 语法是 introduced in Python 3.8。

/ 在参数列表中的基本原理在PEP 570 -- Python Positional-Only Parameters 中给出:

新语法将使库作者能够进一步控制其 API 的调用方式。它将允许指定哪些参数必须被称为仅位置参数,同时防止它们被称为关键字参数。

以前,(信息性)PEP 457 定义了语法,但范围更加模糊。此 PEP 通过证明语法的合理性并在函数定义中提供 / 语法的实现,使原始提案更进一步。

语法和注释 PEP 的比较

相似之处

出于所有意图和目的,如果您理解 help()/ 表示法,那么这就是通过 PEP 570 正式包含在 v3.8 中的 Python 语法。

区别

PEP 570 -- Python Positional-Only Parameters

定义 Python 3.8+ 的语法 语法的正式语法规范 类型:接受

PEP 457 -- Notation For Positional-Only Parameters

定义help() 注释中使用的符号(不是语法) 非正式的英语语言描述 类型:信息

说明与示例

There are already excellent answers on the meaning and usage of / in arguments.

为了节省您的点击次数:

/ 表示所有前面的 参数都是仅位置参数。 / 之前的仅位置参数不能在调用函数时作为 name=value 传递。

Python 3.8 What's New 给出了以下示例:

def pow(x, y, z=None, /):
    r = x**y
    if z is not None:
        r %= z
    return r

有效函数调用:

pow(2, 10) pow(2, 10, 17)

无效函数调用:

pow(x=2, y=10) pow(2, 10, z=17)

【讨论】:

以上是关于Python函数定义中的裸斜杠? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

你能告诉我而不是python中的反斜杠“\”,还有其他可能性吗? [复制]

如何摆脱python windows文件路径字符串中的双反斜杠? [复制]

Python - 函数的输出? [复制]

如何转义 preg_match 模式中的斜杠字符? [复制]

python函数

如何将反斜杠替换为字符串Python中的不同字符