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

时间:2016-04-29 18:40:14

标签: python python-2.7 lambda arguments function-object

我收到了一个关于网络应用中陈旧参数的电话。我看到这篇帖子......

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) 它肯定会产生预期的结果,但它可能导致大量复制和粘贴相同的代码。
  3. 最好的方法是什么?我认为这是一种很好的方式,不是我刚才描述的两种方式中的任何一种,我们还不知道。

3 个答案:

答案 0 :(得分:2)

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

from functools import partial

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

答案 1 :(得分:1)

你可以通过前缀lambda:轻松创建一个没有参数的callable,即:

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

答案 2 :(得分: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