2

基本的に、@- と通常の両方の形式から呼び出せる関数以上のものを含む引数リストを持つデコレータが必要です。私は簡単な回避策を「設計」しましたが、それは醜く、@ 形式の関数をすぐに実行します。これは望ましくない副作用です (もちろん、body_two() を返すためです)。

def status_display_with_comment(comment, closure = None):
    def body_one(function = None):
        def body_two():
            print(comment)
            #an ugly workaround to be able to run both the @- and regular forms
            if function != None:
                print("Entering", function.__name__)
                function()
                print("Exited", function.__name__)
            elif closure != None:
                print("Entering", closure.__name__)
                closure()
                print("Exited", closure.__name__)
        return body_two()
    return body_one

def a_function():
    print('a_function executes')

@status_display_with_comment(comment = 'some comment')
def a_function_with_comment():
   print('a_function_with_comment executes')

a_function_status_display_with_comment = status_display_with_comment(closure = a_function, comment = 'a comment')

a_function_status_display_with_comment()

前もって感謝します。

PS: クロージャ全体に頭を悩ませる必要があります。Schemeのように再帰的に実行できることを考えると、これは楽しいことです(私にとってはずっと前のことです)。

4

1 に答える 1