2017-07-30 6 views
1

私は関数呼び出しにmyArgsを追加するためにpartialを使用しています。 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

はこれをnoneクラスのバージョンである:

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

あなたはあなたのデコレータロジックを後方に持っていれば、引数が付いたデコレータを定義していないので、は__init__になります。あなたは、例えば、__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を取得している、と仮定するとグローバル変数。

+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

関連する問題