Python - 将命名参数传递给函数对象

Python - Pass named arguments to function object

我接到一个关于网络应用中参数过时的电话。我看到这个 post...

wtforms+flask today's date as a default value

...这是正确的。

该字段的默认设置是在网络服务器启动时设置的。这很容易测试。文件中的几个打印语句已被证明。

所以现在高级软件工程师的问题是"how do I pass parameters in?"。

那么...

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) 它肯定会产生预期的结果,但可能会导致大量复制和粘贴相同的代码。

处理此问题的最佳方法是什么?我想有一个很好的方法,它不是我刚才描述的两种方法中的任何一种,我们只是还不知道。

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

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

听起来你可以使用 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

您描述的是现有功能 - functools.partial:

from functools import partial

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