2016-04-29 71 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

相关问题