2016-04-29 68 views
-1

我收到一個關於Web應用程序中陳舊參數的調用。我看到這個帖子...Python - 將命名參數傳遞給函數對象

wtforms+flask today's date as a default value

...這是現貨上。

該字段的默認值是在Web服務器啓動時設置的。這很容易測試。文件中有幾個打印語句,它被證明。

因此,現在的高級軟件工程師的問題是「我如何傳遞參數?」。

那麼接下來...

myfunc(offset=3): 
    .... some code 

fromdate = fields.DateField('From Date', default=myfunc, validators=[validators.required()]) 

但高級軟件工程師希望能夠在它被分配了類似的時間內聯函數的自變量...

fromdate = fields.DateField('From Date', default=myfunc(-10), validators=[validators.required()]) 

。 ..但沒有立即調用它。基本上,存儲函數對象和它的參數而不執行它們,仍然推遲,以便代碼在頁面加載而不是在服務器啓動時運行。

目前,我們有兩個想法。

  1. 該高級軟件工程師正在考慮圍繞該方法打包一個方法。所以然後有一個核心方法,然後是一些其他情景特定的,如myfuncminus10
  2. 我在想lambda表達式。像 myfunc = lambda:datetime.now()。date() - timedelta(days = 365) 它肯定會產生預期的結果,但它可能會導致大量複製和粘貼相同的代碼。

解決此問題的最佳方法是什麼?我認爲有一種很好的方式,不是我剛剛描述的兩種方式之一,我們現在還不知道。

+0

在1分鐘之內回答'functools.partial'。我會刪除我的。 – AKS

+0

另請參閱:[部分應用](https://en.wikipedia.org/wiki/Partial_application)和[Currying](https://en.wikipedia.org/wiki/Currying) –

回答

2

您正在描述現有功能 - functools.partial

from functools import partial 

fromdate = fields.DateField('From Date', default=partial(myfunc, offset=-10), validators=[validators.required()]) 
+0

!謝謝你的提升。這與下面Alex Hall發佈的lamda表達式相比如何? – MrGoodfix

+0

有一些微妙的(早期/後期綁定/堆棧框架相關的)差異(閱讀例如[this thread](http://stackoverflow.com/questions/3252228/python-why-is-functools-partial-necessary)以供參考),但對於這種情況,我相當肯定您可以使用其中一種,而不會注意到其中的差異。 – schwobaseggl

+0

男人,我希望有一種方法可以將多個回答標記爲「答案」 – MrGoodfix

1

您可以輕鬆地只是lambda:前面加上,即創建一個不帶參數的調用:

fromdate = fields.DateField('From Date', default=lambda: myfunc(-10), validators=[validators.required()]) 
+0

哈哈,真好!它看起來像我忽略了一個明顯的選擇。通過使用上述functools的部分內容,這樣做有沒有什麼好處? – MrGoodfix

+0

我個人覺得這更可讀,但其他人似乎不同意。 –

+0

男人,我希望有一種方法可以將多個回答標記爲「真棒」的答案 – MrGoodfix