2016-10-15 3 views
0

yaml 파일에서 설정을 가져오고 싶지만 현재 컨텍스트에서 일반 변수로 사용할 수있게하려고합니다.파일에서 설정 가져 오기

예를 들어 나는 파일이있을 수

param1: 12345 

param2: test11 

param3: 
    a: 4 
    b: 7 
    c: 9 

을 그리고 변수 param1, 내 코드에서 param2, param3을하고 싶습니다.

이 기능을 모든 기능에서 사용하고 싶을 수 있으며 전 세계적으로 사용하고 싶지 않을 수 있습니다.

나는 약 locals()globals() functuons에 대해 들었지만 이것을 사용하는 방법을 얻지 못했습니다.

답변

0

locals()['newvarname'] = 12345을 사용하여 새 변수를 만들 수 있습니다. 그리고 파일을 읽고 원하는대로이 구조를 채울 수 있습니다.

당신은 그것을하고 가져 오기 설정을 호출하는 기능을 쓸 수 있습니다 : 트릭 @의 발드르의 대답에 중대하다

import sys 
import yaml 


def get_settings(filename): 
    flocals = sys._getframe().f_back.f_locals # get locals() from caller 
    with open(filename, 'r') as ysfile: 
     ydata = yaml.load(ysfile.read()) 
    for pname in ydata: 
     # assume the yaml file contains dict 
     flocals[pname] = ydata[pname] # merge caller's locals with new vars 
+3

for 루프와 동일한 일을'update() '하지 않았습니까? – spectras

+0

좋은 지적, 일반적으로 - 그렇습니다. 그러나 나는 하위 키를 다루는 프로젝트에서 더 많은 확장 된 코드를 가지고 있으며, 소스에서 함수를 복사하고 잘라낸 것입니다. – baldr

0

에도 불구하고, 더 나은 가독성을 위해 함수의 외부 변수 할당을 이동하는 것이 좋습니다. 함수 호출자의 컨텍스트가 변경되면 기억하고 유지하는 것이 매우 어려워 보입니다. 따라서

import yaml 

def get_settings(filename): 
    with open(filename, 'r') as yf: 
     return yaml.load(yf.read()) 

def somewhere(): 
    locals().update(get_settings('foo.yaml')) 
    print(param1) 

그럼에도 불구하고 사전을 사용하는 것이 좋습니다. 그렇지 않으면 매우 이상한 버그가 발생할 위험이 있습니다. 예를 들어 yaml 파일에 open 또는 print 키가 있으면 어떻게해야합니까? 그것들은 파이썬의 함수를 오버라이드 할 것이므로, 예제의 print(param1)TypeError 예외를 발생시킬 것입니다.