developer tip

Python : dict의 변수를 네임 스페이스로로드

optionbox 2020. 12. 11. 08:05
반응형

Python : dict의 변수를 네임 스페이스로로드


함수 외부의 함수에 정의 된 여러 지역 변수를 사용하고 싶습니다. 그래서 나는 x=locals()반환 값을 전달 하고 있습니다.

해당 사전에 정의 된 모든 변수를 함수 외부의 네임 스페이스로로드하여을 사용하여 값에 액세스하는 대신 x['variable']단순히 variable.


Bunch대안을 고려하십시오 .

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

따라서 사전 이 있고 clumsier 대신 d구문을 x.foo사용 하여 해당 값에 액세스 (읽기) 하려면 다음을 d['foo']수행하십시오.

x = Bunch(d)

이 내부와 외부 모두 기능을 작동 - 그리고 그건 엄청나게 깨끗하고 주입보다 안전 dglobals()! Zen of Python의 마지막 줄을 기억하십시오 ... :

>>> 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')

내 dict (yaml) 구성에서 재귀 네임 스페이스를 만들기 위해 다음 스 니펫 (PY2)을 사용했습니다.

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)

참고URL : https://stackoverflow.com/questions/2597278/python-load-variables-in-a-dict-into-namespace

반응형