2017-05-04 99 views
3

我读一个Scrapy,Redis的示例项目,https://github.com/rolando/scrapy-redis/blob/master/example-project/process_items.py,其中包含以下的源代码:在Python中,“覆盖”默认参数0的原因是什么?

def process_items(r, keys, timeout, limit=0, log_every=1000, wait=.1): 
    limit = limit or float('inf') 

在我看来,该事实上默认limitfloat('inf'),因为如果没有被指定,它最初采用默认值0,然后在包含布尔运算符or的行中立即转换为float('inf')

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

+3

它有一个目的,当默认参数是一个“列表”或另一个可变的对象,但在这里它似乎是多余的。 –

回答

2

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

该函数然后使用相同的默认值;大概是为了更方便地使用以外的这个命令行用例(通过导入脚本),使其合理地自我记录。然后实际代码使用float('inf')代替实现细节。

没有技术理由使用default=0而不是default=float('inf')然而。

+0

有一个细微的区别:用'float'('inf')覆盖'default = 0'可以防止用户调用值为'0'的函数,而'default = float('inf')'仍然允许调用函数与'0'。 – Wombatz

+0

@Wombatz:它不阻止用户通过limit = 0调用函数。在使用'limit = 0','limit = float('inf')'或完全忽略'limit'之间,行为不会改变。 –

+0

是的,我制定了非常糟糕的。你的措辞更精确 – Wombatz