在的文档randrange()
中,它指出:
不应使用关键字参数,因为它们可能会以意想不到的方式被解释。例如,
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
还必须支持替代签名:该实现会执行检查来查看调用是否使用此签名或另一个签名:
它使用以下代码来实现:
当您调用 时,这才有意义
randrange(100)
,它会转换为对 的调用_randbelow(100)
,这是有意为之。但是当你调用 时
randrange(start=100)
,我们就会进入相同的流程,并且 的值start
也会被解释为stop
。