2016-08-26 11 views
1

ラップされた関数の名前がわからない場合、Pythonデコレータを使用してメソッドをマークし、後で使用することは可能ですか?ここでPythonデコレータ:デベロッパーによるラップ関数のリスト表示

は一例であり、私はmethod_with_custom_nameの名前を知らない:私が正しくあなたの質問を理解していれば

@run_this_method 
def method_with_custom_name(my_arg): 
    return "The args is: " + my_arg 

def _init_and_run(): 
    # Here, I want to get and call method_with_custom_name 
    # but I don't know it's name, 
    # so the next line isn't valid. 
    return run_this_method()(my_arg_value) 

def run_this_method(m): 
    def w(my_arg): 
     _do_some_magic(my_arg, m) 
    return w 

def _do_some_magic(callback_arg, callback): 
    if some_checks(): 
      callback(callback_arg) 

は、どのように私は(@run_this_method

答えて

2

デコレータで装飾されたすべての関数とメソッドを追跡する必要がある場合は、グローバル変数を作成してそのような関数とメソッドをすべて登録する必要があります。私はあなたのコードを変更した:

funcs_registry = [] #List of all functions decorated with @run_this_method 
def run_this_method(m): 
    global functions_registry 
    funcs_registry.append(m) #Add function/method to the registry 

    def w(my_arg): 
     _do_some_magic(my_arg, m) 
    return w 

def _do_some_magic(callback_arg, callback): 
    if some_checks(): 
     callback(callback_arg) 

@run_this_method 
def method_with_custom_name(my_arg): 
    return "The args is: " + my_arg 

def _init_and_run(): 
    global functions_registry 

    # Here you can iterate over "functions_registry" 
    # and do something with each function/method in it 
    for m in functions_registry: 
     print(m.__name__) 

代わりにあなたはデコレータとして使用するクラスを作成し、実体フィールドに関数を登録することができますfunctions_registryグローバル変数を使用します。このような何か:

class FunDecorator: 
    def __init__(self): 
     self.registry = [] 

    def __call__(self, m): 
     "This method is called when some method is decorated" 
     self.registry.append(m) #Add function/method to the registry 

     def w(my_arg): 
      _do_some_magic(my_arg, m) 
     return w 

run_this_method = FunDecorator() #Create class instance to be used as decorator 

@run_this_method 
def method_with_custom_name(my_arg): 
    return "The args is: " + my_arg 

#do some magic with each decorated method: 
for m in run_this_method.registry: 
    print(m.__name__) 
+0

いいえ、あなたは、あなたよりも、それ以上に、これを行うためにグローバルな状態を導入する必要がない、のでアプリで何かを追跡するためにグローバル状態を導入する必要があります。 –

+0

ありがとう、それは動作します。 – dkiselev

+0

@ Two-BitAlchemistは、グローバルな状態を持たずに実装する方法を明確にすることができますか? –

1

で包まれたメソッドのリストを取得することができます不明な名前のメソッドを飾る方法は?)それは完全に可能です。

@decorator 
def foo(bar): 
    pass 

だから、あなただけ行う必要があり、あなたのケースで

def foo(bar): 
    pass 
foo = decorator(foo) 

ためsyntastic砂糖です:

method_with_custom_name = run_this_method(method_with_custom_name) 

あなたが提供した例はしかし、混乱しています。 method_with_custom_nameの名前を知りませんか?それはすぐそこです。 method_with_custom_nameと呼ばれます。後で装飾版を使用するには、単にmethod_with_custom_nameを呼び出します。

+0

私はlibが書いている、と他の誰かが 'method_with_custom_name'を書きますと' another_method_with_custom_name' – dkiselev

関連する問題