2017-08-29 3 views
2

私はデコレータを使ってファイルバックアップのようなコンテキスト管理を行い、プロジェクト内のソートを復元し、その目的のためにデコレータを使用しようとしています。実行時にデコレータにパラメータを渡すにはどうすればいいですか?

しかし、私は実行時に引数をデコレータに渡す方法を理解していません。

例えば私のクラスは次のようになります。

class myLogFileHandler: 
    def __init__(self,file): 
     self.file=file 
     return 

    @copyAndRestoreFile(file=<how-pass-self.file-here?>) 
    def performAction(**kwargs): 
     """ 
      do something 
     """ 

そして、私のデコレータは次のようになります。

def copyAndRestoreFile(file): 
    def dec(fn): 
     def wrapper(*args,**kwargs): 
      #copy file to temp... 
      fn(*args,**kwargs) 
      #restore file from temp... 
     return wrapper 
    return dec 

をしかし、あなたが見るように、私は、オブジェクトを作成する場合にのみ、ファイル名のavailbleになります。そのような問題を解決する方法。このアプローチでは

  1. は、引数なしでデコレータを作成し、それが入力された引数の辞書内の特定の変数を探し作る。..

    def copyAndRestoreFile(fn): 
        def dec(**kwargs,file): 
         #copy file to temp... 
         fn(*args,**kwargs) 
         #restore file from temp... 
        return dec 
    
    @copyAndRestoreFile 
    def performAction(**kwargs,file=self.file): 
        """ 
         do something 
        """ 
    

    は、私が働いていたソリューションのカップルを試してみました私はデコレータを一般的なものにすることはできません。それを使用する人は、装飾されている関数へのファイルargを持っているはずです。それは私が見ているconです...

  2. 飾るには、実行時に...

    def performAction(**kwargs): 
        copyAndRestoreFile(file=self.file)(self._actualActionCode)(**kwargs) 
    
    def _actualActionCode(**kwargs): 
        """ 
         do something 
        """ 
    

は問題にアプローチするために任意のより良い方法はありますか?

+2

def wrapper(* args、** kwargs):をdef wrapper(self、* args、** kwargs): 'に変更し、' self'引数を使用してファイル名を解決する方法もあります。ただし、これはあなたのデコレータをあなたの特定のクラスと一緒にのみ使用可能にします。 – Kendas

+0

はい私は同意します..他のクラスがファイル名をいくつかの他の属性名に格納している場合、それは動作しません.. :( –

+0

2番目の例は、 'self.performAction = copyAndRestoreFile(file = self .file)(self._actualActionCode) ' – Kendas

答えて

関連する問題