为什么 `randrange(start=100)` 不会引发错误?

问题描述 投票:0回答:1

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。

python parameter-passing
1个回答
0
投票

这是因为

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

© www.soinside.com 2019 - 2024. All rights reserved.