2013-09-23 2 views
0

나는 이것에 대해 여러 게시물을 알고 있지만 여전히 혼란 스럽다. 초기화에 정적 변수를 사용하려고 시도하고 그것을 수행하는 방법을 모른다. 그래서 내가 가진 패키지 'config'는 the_config.py 모듈을 가지고 있습니다. 내가하고 싶은 것은 그 다음이 pipeline.py파이썬 정적 변수와 메소드

#pipeline.py 

import config.the_config as my_config 

def main(argv): 

    ... 
    my_config.intialize(user_settings_file) 
    print my_config.user_settings['Output_Dir'] 

으로 호출 모듈이 될 것입니다하지만이 작동하지 않습니다

# the_config.py 

import yaml 

user_settings=None 

def initialize(user_settings_file) 

    with open(user_settings_file) as yaml_handle: 
    user_settings = yaml.safe_load(user_settings_file) 

등이 될 일입니다. 이 일을 어떻게해야합니까?

미리 감사드립니다.

답변

3

user_settings에 할당하면 initialize 함수에서 자동으로 로컬 변수로 처리됩니다. 할당 대신 글로벌 변수를 변경하도록 구성되어 파이썬을 말하자면, 당신은 initialize의 시작 부분에

global user_settings 

를 작성해야합니다. 그것이 아니라면 함수의 본문에 할당 된 모든 변수, 지역 변수를 고려 파이썬에서

0

명시 적으로 중 하나 global 또는 nonlocal 선언 다르게 선언 하고있다.

파이썬은 += 또는 /=과 같은 "확장 할당"연산자를 할당한다고 생각합니다.

수정 된 global의 필수 선언은 Python에서 변수를 선언 할 필요가 없다는 사실에 지불하는 (약간의) 가격입니다.

코드가 전역 변수가 유지되는 상태에서 변형 상태에 너무 많이 의존하지 않는다고 가정합니다. 따라서 코드에 많은 global 선언이 필요한 경우 문제가있을 수 있습니다.

+0

모듈 속성과 동작 생성 - 설정처럼 및 로그 설정. 그래서 그들을 한 번 초기화하고 모든 수업에서 사용하십시오. – user2689782

0

나는 이것을 해결할 방법을 제안 할 수 있습니다. 문제의 모든 루트의

먼저 오른쪽 변수 이름 파이썬에 등호이에 (범위를 해당 새로운 변수를 생성이되는 즉시 초기화 기능

user_settings = yaml.safe_load(user_settings_file) 

을 새로운 지역 변수의 창조 를 사용할 수 있습니다 이것을 방지하기 위해 initialize 기능

에 대한 지역 구분 :

사용 global 선언을

기존 변수를 수정할 수 있지만 새로 하나

user_settings = {} 
def initialize(user_settings_file) 
    with open(user_settings_file) as yaml_handle: 
     user_settings.update(yaml.safe_load(user_settings_file)) # here we modify existing user_settings 

난 그냥 몇 가지에 대해이 작업을 수행하려면 (이 꽤 까다 롭습니다)

user_settings = {} 
def initialize(user_settings_file) 
    with open(user_settings_file) as yaml_handle: 
     import the_config 
     the_config.user_settings = yaml.safe_load(user_settings_file)