让呼叫者使用functools.partial或者调用工厂函数?

2024-06-06 17:02:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过一些比较partiallambda的参数,但大多数讨论的是{}如何更灵活(不限于表达式),并给出了有关包装函数的信息。但我想从来电者的角度考虑这个问题。这是我的情况。在

我有一个接受单参数修饰符函数的函数。请求被传递到要修改的修饰符函数中:

def my_func(request, modifier):
  modifier(request)

我还构建了一些实用程序,使创建参数化修饰符函数更容易,例如,向请求添加/修改URL参数。我想了两种方法,但不确定哪一种更好。在

选项1

^{pr2}$

这样,调用方可以使用functools.partial绑定params,如下所示:

modifier = functools.partial(add_params, params={'abc':'123'})

方案2

def add_params(params):
  def func(request):
    for param in params:
      # Modify request with param.
  return func

然后呼叫者就这样使用它:

modifier = add_params({'abc':'123'})

问题

如果我不关心函数内省,那么使用选项2有什么缺点吗?选项2会遇到后期绑定问题吗?(尽管我的用例没有遇到这种情况)。我真的很喜欢选项2更容易被呼叫者使用。在


Tags: 函数add参数paramrequestdef选项情况
2条回答
def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

与部分函数实现代码相比,您的选项2也不错,我不认为它在您的情况。但是functools.partial是简化签名的常见方法, 如果要为另一个函数返回新的分部函数,仍然可以调用分部函数函数if如果要使用选项2模型,则可能需要实现一个新功能

从数学角度来看,这两个函数完全同构(尽管它们的效率可能有所不同):

# Option 1
(Request, Params) -> None

# Option 2
Params -> (Request -> None)

出于您的目的,我认为选项2提供了最方便的功能,因为该函数已经被使用了,因此您不仅可以避免partial,而且可以轻松地组合它们:

^{pr2}$

如果要直接调用函数,则可以执行以下操作:

add_params({'abc':'123'})(request)

与方案1相比,这并不是全部内容:

add_params(request, {'abc':'123'})

除非使用函数外部的变量,否则后期绑定不应该引起问题,如果这样做,总有办法解决它。在

不幸的是,选项2的缺点是难以定义,但使用decorator可以简化这一点:

def curry_request(f):
  def wrapper(*args, **kwargs):
    def inner(request):
      f(request, *args, **kwargs)
    return inner
  return wrapper

@curry_request
def add_params(request, params):
  # do something

相关问题 更多 >