functools.partial(func,myArgs)等同于什么类?

时间:2017-07-30 21:23:37

标签: python

我正在使用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)

我得到的错误是:

  

返回functools.partial(func,self.HOST,self.TOKEN)TypeError:   第一个参数必须是可调用的

以下是此类的非类版本:

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')

1 个答案:

答案 0 :(得分:3)

你的装饰师逻辑向后,你在func得到__init__(因为你没有定义带参数的装饰者)。您可以在func中获得__call__的任何参数,例如:

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