関数の外で、関数で定義されたローカル変数の束を使用したい。そのため、戻り値にx=locals()
を渡します。
その辞書で定義されているすべての変数を関数の外の名前空間にロードするにはどうすればよいですか。したがって、x['variable']
を使用して値にアクセスする代わりに、variable
を使用できます。
Bunch
の代替案を検討してください。
_class Bunch(object):
def __init__(self, adict):
self.__dict__.update(adict)
_
したがって、辞書d
があり、構文が_x.foo
_ではなく、構文_d['foo']
_でその値にアクセス(読み取り)する場合は、
_x = Bunch(d)
_
これは関数の内側と外側の両方で機能します-そして、それは途方もなくd
をglobals()
に注入するよりもクリーンで安全です! Python of Zenの最後の行を思い出してください...:
_>>> import this
The Zen of Python, by Tim Peters
...
Namespaces are one honking great idea -- let's do more of those!
_
独自のオブジェクトを作成する代わりに、argparse.Namespace
を使用できます。
from argparse import Namespace
ns = Namespace(**mydict)
逆を行うには:
mydict = vars(ns)
これは、あるローカルスペースの変数を別のローカルスペースにインポートするのに、彼/彼女が何をしているかを知っている限り、完全に有効なケースです。このようなコードが便利な方法で何度も使用されているのを見てきました。共通のグローバルスペースを汚染しないように注意する必要があります。
次のことができます。
adict = { 'x' : 'I am x', 'y' : ' I am y' }
locals().update(adict)
blah(x)
blah(y)
変数をローカル名前空間にインポートすることは有効な問題であり、テンプレートフレームワークでよく使用されます。
関数からすべてのローカル変数を返します。
return locals()
次に、次のようにインポートします。
r = fce()
for key in r.keys():
exec(key + " = r['" + key + "']")
常にこのオプションがあります。これが最良の方法であることはわかりませんが、確かに機能します。 type(x)= dictと仮定
for key, val in x.items(): # unpack the keys from the dictionary to individual variables
exec (key + '=val')
次のスニペット(PY2)を使用して、dict(yaml)構成から再帰的な名前空間を作成します。
class NameSpace(object):
def __setattr__(self, key, value):
raise AttributeError('Please don\'t modify config dict')
def dump_to_namespace(ns, d):
for k, v in d.iteritems():
if isinstance(v, dict):
leaf_ns = NameSpace()
ns.__dict__[k] = leaf_ns
dump_to_namespace(leaf_ns, v)
else:
ns.__dict__[k] = v
config = NameSpace()
dump_to_namespace(config, config_dict)