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
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文件路径字符串中的双反斜杠? [复制]