【问题标题】:What is the class equivalent of functools.partial(func,myArgs)?functools.partial(func,myArgs) 的等效类是什么?
【发布时间】:2018-01-06 08:58:12
【问题描述】:

我正在使用 partial 将 myArgs 添加到我的函数调用中。但是计算 myArgs 的值需要从文件中读取它。 我想将部分装饰器转换为一个类。 我该怎么做?

class withHostAndToken(object):

    def __init__(self, func):
        self.HOST = ''
        self.TOKEN = ''


    def __call__(self, func):

        if self.HOST == '':
            self.HOST = cfg.getHost()
        if self.TOKEN == '':
            self.TOKEN == cfg.getToken()

        return functools.partial( func , self.HOST, self.TOKEN)

我得到的错误是:

return functools.partial( func , self.HOST, self.TOKEN) 类型错误: 第一个参数必须是可调用的

这是这个的无类版本:

def withHostAndToken(func):
    HOST = cfg.getHost()
    TOKEN = cfg.getToken()
    return functools.partial(func , HOST, TOKEN)

这适用于:

@withHostAndToken
def myFunction(HOST, TOKEN, other_arg):
    '''do something'''

myFunction(other_arg='someValue')

【问题讨论】:

  • 我开始回答这个问题,但是......不能。您能否发布有关您希望如何使用它以及如何使用functools.partial 的示例?
  • func 是什么,好像不是函数?还有为什么要传给__init__()__call__()
  • 同意。 func 这里是什么?
  • 因为partial期望得到一个func作为第一个参数。

标签: python


【解决方案1】:

你的装饰器逻辑倒退了,你在__init__ 中得到了func(因为你没有用参数定义装饰器)。您将在__call__ 中获得func 的任何参数,例如:

class withHostAndToken(object):
    def __init__(self, func):
        self.func = functools.partial(func, HOST=cfg.getHost(), TOKEN=cfg.getToken())    

    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)

虽然你不需要functools.partial,例如:

class withHostAndToken(object):
    def __init__(self, func):
        self.func = func
        self.HOST = cfg.getHost()
        self.TOKEN = cfg.getToken()  

    def __call__(self, *args, **kwargs):
        return self.func(self.HOST, self.TOKEN, *args, **kwargs)

注意:不确定你从哪里得到cfg,假设是一个全局变量。

【讨论】:

  • 但是如果 func 得到其他参数,比如:def withHostAndToken(func): HOST = cfg.getHost() TOKEN = cfg.getToken() return functools.partial(func , HOST, TOKEN) and this works with: @withHostAndToken def myFunction(HOST, TOKEN, other_arg): '''do something''' myFunction(other_arg='someValue')
  • 只需将*args, **kwargs 传递给您的下游函数。
  • __init__ cfg.getToken()) 中有额外的括号。我无法编辑,因为改动太小了。
  • 应该在第二个例子中提到它:)
猜你喜欢
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2016-03-21
  • 2016-12-01
  • 2011-11-10
  • 1970-01-01
  • 2018-05-01
相关资源
最近更新 更多