私の疑惑は、私がやりたいことは、Pythonではきれいに実行できないということです。相互に呼び出すネストされた関数をいくつか示します。(一般に、それらは字句スコープである必要はありませんが、動的に相互に呼び出す必要があります。)
def outer() :
s_outer = "outer\n"
def inner() :
s_inner = "inner\n"
do_something()
inner()
ここで、呼び出すときにdo_something()
、呼び出し元の関数の変数にアクセスしたいと思います。この場合は、呼び出しスタックのさらに上にs_outer
ありs_inner
ます。
残念ながら、ここでのキーワードは、関数内でnonlocal
定義した場合にのみ役立ちます。ただし、同じレベルで定義すると、キーワードは機能しません。do_something()
inner()
outer()
nonlocal
ただし、他のさまざまな関数から呼び出したいのですdo_something()
が、常にそれぞれのコンテキストで実行し、それぞれのスコープにアクセスします。
いたずらを感じて、私は次のように内部から呼び出すことができる小さなアクセサを書きましたdo_something()
:
def reach(name) :
for f in inspect.stack() :
if name in f[0].f_locals : return f[0].f_locals[name]
return None
その後
def do_something() :
print( reach("s_outer"), reach("s_inner") )
うまく動作します。
私の2つの質問はこれらです
この問題を解決するためのより良い方法はありますか?(それぞれのデータをdictにラップし、これらのdictを明示的にに渡す以外
do_something()
)reach()
関数を実装するためのよりエレガントで短縮された方法はありますか?
乾杯!