2017-07-30 58 views
1

我正在使用partial来将myArgs添加到我的函数调用中。但是计算myArgs的值需要从文件中读取它。 我想将部分装饰器转换为类。 我该怎么办?functools.partial(func,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) TypeError: the first argument must be callable

下面是这个无类版本:

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

我开始回答这个问题,但......不能。你可以在你如何使用'functools.partial'的方式发布例子吗? –

+1

什么是'func',看起来不是函数?为什么你将它传递给'__init __()'和'__call __()' – AChampion

+1

同意。这里有什么'func'? –

回答

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,假设一个全局变量。

+0

但如果FUNC得到其他参数,如: '高清withHostAndToken(FUNC): HOST = cfg.getHost() TOKEN = cfg.getToken() 回报functools.partial(FUNC,HOST,TOKEN) 这 @withHostAndToken 高清myFunction的(HOST,TOKEN,other_arg):用工作 '' '做些什么' '' myFunction的(other_arg = 'someValue中')' –

+0

只需通过'* ARGS,** kwargs'到你的下游功能。 – AChampion

+0

在'cfg.getToken()'''''__init__'处有额外的括号。我无法编辑,因为它的变化太小。 – nutmeg64