-1

我接到一个关于网络应用程序中过时参数的电话。我看到了这个帖子...

wtforms+flask 今天的日期作为默认值

......这是正确的。

该字段的默认设置是在 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) 这样的东西肯定会产生预期的结果,但可能会导致大量复制和粘贴相同的代码。

解决这个问题的最佳方法是什么?我认为有一种非常好的方法,它不是我刚刚描述的两种方法中的任何一种,我们只是还不知道。

4

3 回答 3

2

You are describing an existing feature - functools.partial:

from functools import partial

fromdate = fields.DateField('From Date', default=partial(myfunc, offset=-10), validators=[validators.required()])
于 2016-04-29T18:46:25.447 回答
1

您只需在前面加上 ,即可轻松创建不带参数的可调用对象lambda:,即:

fromdate = fields.DateField('From Date', default=lambda: myfunc(-10), validators=[validators.required()])
于 2016-04-29T18:45:11.027 回答
1

听起来你可以使用 functools.partial:

>>> from functools import partial
>>> fromdate = fields.DateField('From Date', default=partial(myfunc, 10), validators=[validators.required()])

更多信息:https ://docs.python.org/2/library/functools.html#functools.partial

于 2016-04-29T18:46:00.640 回答