繁体   English   中英

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

[英]Python - Pass named arguments to function object

我收到了有关Web应用程序中过时参数的电话。 我看到了这个帖子...

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

解决此问题的最佳方法是什么? 我在想,有一种不错的方法不是我刚才描述的两种方法之一,而我们只是还不知道。

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

from functools import partial

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

您只需在代码前加上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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM