2017-05-04 53 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