【发布时间】:2017-05-16 10:39:34
【问题描述】:
为什么范围允许非默认参数(stop)跟随默认参数(start)?
例子:
>>> r = range(1, 2, 3)
>>> print(r.start, r.stop, r.step)
1 2 3
>>> r = range(10)
>>> print(r.start, r.stop, r.step)
0 10 1
试图模仿签名是明显的违规行为:
def my_range(start=0, stop, end=1):
pass
我知道它在C 中实现的事实可能允许在 Pythonland 中出现违规行为。
我猜这样做是为了使 API 更加用户友好,但我没有找到任何支持它的资源(源代码并没有说明太多,PEP 457 仅说明了range很奇怪)。有谁知道为什么这样做?
【问题讨论】:
-
检查文档:
range似乎有 2 个不同的签名!class range(object) | range(stop) -> range object | range(start, stop[, step]) -> range object -
@JimFasarakisHiliard 关闭,但重新打开。这不是骗局,我应该更好地阅读您的问题。有用的链接:stackoverflow.com/questions/8637130/…
-
@Jean-FrançoisFabre 我想我会的,因为我并不想自己实现它:-)。
-
为时已晚,为你做到了 :) 现在我无法再次关闭问题,但我想我不会。我最好想出一个答案。
-
找到了源代码,没有帮助:hg.python.org/cpython/file/3f739f42be51/Objects/rangeobject.c(没有评论解释原因)。我的猜测和你的一样好:只允许启动或步进是没有用的,并且在执行循环时必须指定启动和停止会比 C 循环更糟糕。也许 Raymond Hettinger 或 Alex Martelli 可以回答。
标签: python python-3.x python-internals