外側の関数のローカル変数を使用している別の関数内で関数を定義することは、特にイベント サブスクリプションの場合のように、内側の関数自体をコードの別の部分に渡す場合に完全に理にかなっています。
ただし、コードを見ると、必要なオブジェクトとイベントの間にはすでに直接的な関係があるようです。なるほど、簡単に への参照ができC1.method2.RequestEventそうです。その場合、それをハンドラーに渡すことができます。ハンドラーは次のようになります。RequestEventC1
def handleResponseEvent(request, response, dnp):
はdnp、DNPClassイベントによって参照されるインスタンスです ( C1)。requestまたはresponseすでに を参照している可能性もあるDNPClassため、追加の引数は必要ありません。
これにより、インスタンスに関係なく同じハンドラーを使用してサブスクライブできます。例えば:
def main():
C1 = DNPClass()
C1.method1(arg1, arg2, arg3, arg4, arg5)
# subscribing to event
C1.method2.RequestEvent += handleResponseEvent # will call C1.method3
C2 = DNPClass()
C2.method2.RequestEvent += handleResponseEvent # will call C2.method3
def handleResponseEvent(request, response):
#code to execute when event handler is called
#code references additional method from current DNPClass instance
request.dnp.method3()
...
これが機能せず、DNPClassコードを編集して機能させることができない場合は、少なくともインスタンスを受け入れる単一の関数に限定して、毎回新しい内部関数を定義する必要がないようにします。このようなもの:
def subscribe_handleResponseEvent(dnp):
def handleResponseEvent(request, response):
#code to execute when event handler is called
#code references additional method from dnp instance
dnp.method3()
...
dnp.method2.RequestEvent += handleResponseEvent
def main():
C1 = DNPClass()
C1.method1(arg1, arg2, arg3, arg4, arg5)
# subscribing to event
subscribe_handleResponseEvent(C1)
...