2009-08-18 2 views
0

任意のpython関数をデコレートする方法を探していますので、元の代わりに関数を呼び出し、すべてのパラメータをリストまたはdictとして渡します。渡されたすべてのパラメータをサポートしている間にPython関数を置き換える方法

def replace_func(f, replacement_f): 
    def new_f(*args, **kwargs): 
     replacement_f(args, kwargs) 
    return new_f 

しかし、私はnew_freplacement_fを参照することはできません。

はより正確には、このような何か(fは任意の関数であり、replacement_fリストや辞書を取ります)。そして、私はにnew_fを渡す標準的なトリックを、異なるパラメータのデフォルトとして使用することはできません。これは、*args**kwargsの可変引数リストを使用しているためです。

元の関数が呼び出された場所は変更できず、定位置と名前付きの両方のパラメータを受け入れます。

私はそれがあまり明確ではないことを恐れていますが、必要であれば明確にすることができます。

おかげ

+0

あなたが正しいです:これは明らかではありません。私は元の関数の呼び出しを変更する必要はなく、むしろその定義を変更すると思います。それを変更できない場合は、おそらくそれを飾ることはできません。おかげですべて – hop

+0

。私はこれを非常に困難にしていましたが、私は* args、** kwargsの面倒なことがなくても関数を置き換えることができます。 また、Python 1.xからスコープルールが変更されたと思います。今では、内部関数定義内の外部関数から変数を参照できます。 – Mzzzzzz

答えて

4

f = replacement_f 

>>> def rep(*args): 
    print(*args, sep=' -- ') 

>>> def ori(*args): 
    print(args) 

>>> ori('dfef', 32) 
('dfef', 32) 
>>> ori = rep 
>>> ori('dfef', 32) 
dfef -- 32 
0

私はこれを正しく理解していれば、あなたは別の関数からすべての引数を渡したいです。

は単純に実行します。

あなただけしようとしない理由
def replace_func(f, replacement_f): 
    def new_f(*args, **kwargs): 
     replacement_f(*args, **kwargs) # args & kwargs will be expanded 
    return new_f 
0

をこれはあなたが何を意味するかでしょうか?未テスト

def replace_func(f, replacement_f): 
    nonlocal replacement_f #<<<<<<<<<<<<<<<py3k magic 
    def new_f(*args, **kwargs): 
     replacement_f(*args, **kwargs) # args & kwargs will be expanded 
    replacement_f = new_f 

Python nonlocal statement

編集:そのスタートは、正確に何をしたい、混乱イムが、私はそれがあなたのために働く場合SilentGhostの答えは、最善の解決策だと思いますが

1

を支援する非局所的だと思います

引数をとるデコレータを定義するには、追加のレベルを追加する必要があります。

def replace_function(repl): 
    def deco(f): 
     def inner_f(*args, **kwargs): 
      repl(*args, **kwargs) 

     return inner_f 
    return deco 

今、あなたは、引数でデコレータを使用することができます。

@replace_function(replacement_f) 
def original_function(*args, **kwargs): 
    .... 
+0

これは@行ですか? –

+0

これは、デコレータが関数にどのように適用されるかを示しています。ありがとう、ホップ。 – hop

+0

それは私が元々考えていたものに近い – Mzzzzzz

関連する問題