Python 2 (3 については不明) では、locals 辞書は、実際に locals() を呼び出したときにのみ更新されます。だから例えば
l=locals()
x=2
l['x']
l
キー「x」が含まれていないため失敗しますが、
l=locals()
x=2
locals()
l['x']
2 を返します。
ローカル辞書を強制的に更新する方法を探していますが、秘訣は別のスタック フレームにいることです。だから例えば私はやろうとしている
l=locals()
x=2
force_update()
l['x']
関数を書く必要がありforce_update()
ます。上記の関数から、 を介して親フレームを取得でき、inspect.currentframe().f_back
さらに を介して親 (更新されていない) ローカルを取得できることはわかってinspect.currentframe().f_back.f_locals
いますが、更新を強制するにはどうすればよいですか?
これが複雑に思える場合、私の主な目標は、 の省略形である関数を作成することです。"{some} string".format(**dict(globals(),**locals()))
これにより、毎回それを入力する必要がなくなり、代わりにfmt("{some} string")
. そうすることで、上記の問題に遭遇します。
編集:以下のMartjinの回答で、以下は本質的に私が探していた解決策です。呼び出し先のスタック フレームを取得する方法を正確にいじることができます。ここでは、 を介して行いpartial
ます。
from functools import partial
from inspect import currentframe
fmt = partial(lambda s,f: s.format(**dict(globals(),**f.f_locals)),f=currentframe())
x=2
print fmt("{x}") #prints "2"