0

リストまたは辞書として渡されるすべてのパラメーターを使用して、元の関数の代わりに代替関数が呼び出されるように、任意の python 関数を装飾する方法を探しています。

より正確には、次のようなものです (f は任意の関数であり、replacement_f はリストと辞書を取ります):

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

ただし、replacement_f内部を参照することはできませんnew_f。また、変数引数リストと可変引数リストを使用しているため、別のパラメーターのデフォルトとしてreplacement_fを渡すという標準的なトリックを使用することはできません。new_f*args**kwargs

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

あまり明確ではないのではないかと思いますが、必要に応じて明確にしていただければ幸いです。

ありがとう

4

4 に答える 4

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
于 2009-08-18T17:44:41.600 に答える
1

SilentGhostの答えは、それがうまくいく場合に最適な解決策だと思いますが、完全を期すために、これがあなたがやろうとしていることの正しいバージョンです。

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

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):
    ....
于 2009-08-18T18:17:56.743 に答える
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 非ローカル ステートメント

編集:それは始まりです。私はあなたが望むものを正確に混乱させていますが、非ローカルが役立つと思います

于 2009-08-18T17:48:48.427 に答える
0

私がこれを正しく理解していれば、ある関数から別の関数にすべての引数を渡したいと思うでしょう。

単に行う:

def replace_func(f, replacement_f):
    def new_f(*args, **kwargs):
        replacement_f(*args, **kwargs) # args & kwargs will be expanded
    return new_f
于 2009-08-18T17:43:27.063 に答える