web-dev-qa-db-ja.com

Python:dictの変数を名前空間にロードする

関数の外で、関数で定義されたローカル変数の束を使用したい。そのため、戻り値にx=locals()を渡します。

その辞書で定義されているすべての変数を関数の外の名前空間にロードするにはどうすればよいですか。したがって、x['variable']を使用して値にアクセスする代わりに、variableを使用できます。

57
dzhelil

Bunchの代替案を検討してください。

_class Bunch(object):
  def __init__(self, adict):
    self.__dict__.update(adict)
_

したがって、辞書dがあり、構文が_x.foo_ではなく、構文_d['foo']_でその値にアクセス(読み取り)する場合は、

_x = Bunch(d)
_

これは関数の内側と外側の両方で機能します-そして、それは途方もなくdglobals()に注入するよりもクリーンで安全です! Python of Zenの最後の行を思い出してください...:

_>>> import this
The Zen of Python, by Tim Peters
   ...
Namespaces are one honking great idea -- let's do more of those!
_
86
Alex Martelli

独自のオブジェクトを作成する代わりに、argparse.Namespaceを使用できます。

from argparse import Namespace
ns = Namespace(**mydict)

逆を行うには:

mydict = vars(ns)
18
orodbhen

これは、あるローカルスペースの変数を別のローカルスペースにインポートするのに、彼/彼女が何をしているかを知っている限り、完全に有効なケースです。このようなコードが便利な方法で何度も使用されているのを見てきました。共通のグローバルスペースを汚染しないように注意する必要があります。

次のことができます。

adict = { 'x' : 'I am x', 'y' : ' I am y' }
locals().update(adict)
blah(x)
blah(y)
16
Thava

変数をローカル名前空間にインポートすることは有効な問題であり、テンプレートフレームワークでよく使用されます。

関数からすべてのローカル変数を返します。

return locals()

次に、次のようにインポートします。

r = fce()
for key in r.keys():
   exec(key + " = r['" + key + "']")
7
Radek

常にこのオプションがあります。これが最良の方法であることはわかりませんが、確かに機能します。 type(x)= dictと仮定

for key, val in x.items():  # unpack the keys from the dictionary to individual variables
    exec (key + '=val')
0
SBFRF

次のスニペット(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)
0
madzohan