在Python中,';覆盖';默认参数为0?

在Python中,';覆盖';默认参数为0?,python,Python,我正在阅读Scrapy Redis示例项目的源代码,其中包含以下内容: def process_items(r, keys, timeout, limit=0, log_every=1000, wait=.1): limit = limit or float('inf') 在我看来,limit的实际默认值是float('inf'),因为如果没有指定它,它首先假定默认值0,然后在包含布尔运算符或的行中立即转换为float('inf') 我的问题是:为什么不在def行中设置默认的limit

我正在阅读Scrapy Redis示例项目的源代码,其中包含以下内容:

def process_items(r, keys, timeout, limit=0, log_every=1000, wait=.1):
    limit = limit or float('inf')
在我看来,
limit
的实际默认值是
float('inf')
,因为如果没有指定它,它首先假定默认值
0
,然后在包含布尔运算符
的行中立即转换为
float('inf')


我的问题是:为什么不在
def
行中设置默认的
limit=float('inf')
?这种模式有什么原因吗?

代码由命令行界面驱动。命令行界面使用
0
作为
limit
的默认值。这是在类似情况下禁用限制的事实标准,因为使用其他选项(让命令行用户使用
float('inf')
,或者使用单独的开关,如果通过其他方式设置,则再次禁用限制)是不必要的复杂

然后该函数使用相同的默认值;大概是为了在命令行用例之外更容易地使用该函数(通过导入脚本),从而使其具有合理的自文档化。实际代码使用的是
float('inf')
,这是一个实现细节


但是,在
default=float('inf')
上使用
default=0
并没有技术上的原因。

当默认参数是一个
list
或另一个可变对象时,它有其作用,但在这里它似乎是多余的。有一点区别:用
float('inf')覆盖
default=0
阻止用户调用值为
0
的函数,而
default=float('inf')
仍然允许调用值为
0
@Wombatz的函数:它不阻止用户调用值为
limit=0
的函数。在使用
limit=0
limit=float('inf')
或完全忽略
limit
之间,行为没有改变。是的,我的表述很糟糕。你的措辞要精确得多