在 randrange()
的
docs中,它指出:
不应使用关键字参数,因为它们可能会以意想不到的方式进行解释。例如,
被解释为randrange(start=100)
。randrange(0, 100, 1)
如果签名是
random.randrange(start, stop[, step])
,为什么 randrange(start=100)
不会引发错误,因为 stop
没有传递值?
为什么
randrange(start=100)
会被解释为randrange(0, 100, 1)
?
我并不是想了解编写代码的人的设计选择,而是想了解它是如何实现的。 我认为没有默认值的参数需要传递参数,否则会引发 TypeError。
这是因为
randrange
的代码还必须支持替代签名:
random.randrange(stop)
该实现执行检查以查看调用是否使用此签名或另一个签名:
random.randrange(start, stop[, step])
它是用这个代码来实现的:
istart = _index(start)
if stop is None:
if istart > 0:
return self._randbelow(istart)
当您调用
randrange(100)
时,这是有意义的,它会转化为对 _randbelow(100)
的调用,这是有意的。
但是当你调用
randrange(start=100)
时,我们就会进入相同的流程,并且 start
的值也被解释为 stop
。