在Python中,';覆盖';默认参数为0?
我正在阅读Scrapy Redis示例项目的源代码,其中包含以下内容:在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
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
之间,行为没有改变。是的,我的表述很糟糕。你的措辞要精确得多