PEP 559 – 内置 noop()
- 作者:
- Barry Warsaw <barry at python.org>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建日期:
- 2017年9月8日
- Python 版本:
- 3.7
- 发布历史:
- 2017年9月9日
- 决议:
- Python-Dev 消息
摘要
此 PEP 提议添加一个名为 noop()
的新内置函数,它不做任何事,只返回 None
。
基本原理
在 Python 中实现一个 no-op 函数非常简单。事实上,它如此容易,以至于许多人一遍又一遍地多次实现它。在许多情况下,有一个通用且不做任何事的内置函数会很有用。
一种用例是针对 PEP 553,您可以在其中将断点环境变量设置为以下内容,以有效地禁用它
$ setenv PYTHONBREAKPOINT=noop
实施
noop()
函数的 Python 等价物恰好是
def noop(*args, **kws):
return None
C 语言的内置实现可在拉取请求 [1] 中找到。
被拒绝的替代方案
noop()
返回一些东西
YAGNI (你永远不需要它)。
此提议被否决,因为它使语义复杂化。例如,如果您始终同时返回 *args
和 **kws
,那么当两者都未给出时,您会返回什么?返回一个元组 ((), {})
有点难看,但提供了一致性。但您也可能只希望返回 None
,因为从概念上讲,函数传入的也是这个。
或者,如果您只传入一个位置参数,例如 noop(7)
。您是返回 7
还是 ((7,), {})
?等等。
作者声称您永远不需要 noop()
的返回值,因此它将始终返回 None
。
Coghlan 的对话 (已编辑格式)
我对此的反驳是map(noop, iterable)
、sorted(iterable, key=noop)
等。(filter
、max
和min
都接受接受单个参数的可调用对象,许多 itertools 操作也一样)。在这些情况下,将
noop()
作为一个有用的默认函数,只需要将定义为def noop(*args, **kwds): return args[0] if args else None对这个反驳的反驳是,在所有这些情况下使用
None
作为默认值将更快,因为它允许算法完全跳过回调,而不是调用它并让它什么也不做。
参考资料
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0559.rst