2017-07-30 36 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

相關問題