[免責事項:私がやりたいことを行うためのより多くのpythonicな方法があるかもしれませんが、pythonのスコープがここでどのように機能するかを知りたいです]
名前を別の関数のスコープに挿入するようなことを行うデコレータを作成する方法を見つけようとしています(名前がデコレータのスコープ外に漏れないように)。たとえば、var
定義されていないという名前の変数を出力する関数がある場合、それが呼び出されるデコレーター内で定義したいと思います。壊れる例を次に示します。
c = 'Message'
def decorator_factory(value):
def msg_decorator(f):
def inner_dec(*args, **kwargs):
var = value
res = f(*args, **kwargs)
return res
return inner_dec
return msg_decorator
@decorator_factory(c)
def msg_printer():
print var
msg_printer()
「」を出力したいのですが、次のようになりMessage
ます。
NameError: global name 'var' is not defined
var
トレースバックは、定義されている場所を指しています。
<ipython-input-25-34b84bee70dc> in inner_dec(*args, **kwargs)
8 def inner_dec(*args, **kwargs):
9 var = value
---> 10 res = f(*args, **kwargs)
11 return res
12 return inner_dec
だから、なぜ見つからないのか理解できませんvar
。
このようなことをする方法はありますか?