2016-07-28 3 views
2

3 개의 파일이 있습니다. 하나는 변수를 정의하고 다른 두 개는 필수 모듈을 포함합니다.가져온 파일의 Python 추출 변수

variable.py

my_var = "" 

test.py

import variable 

def trial(): 
    variable.my_var = "Hello" 

main.py (작동하지 않는)

from variable import * 
from test import trial 

if __name__ == "__main__": 
    trial() 
    print my_var 

그리고 실행 main.py, 아무것도 표시하지 않습니다. 나는이 같은 main.py을 변경하는 경우에는

main.py는

import variable 
from test import trial 

if __name__ == "__main__": 
    trial() 
    print variable.my_var 

을 (작업) 그리고 그것은 나에게 기대 출력 즉 Hello을 제공합니다.

저의 경우 variable.py에는 더 많은 변수가 포함되어 있으며 액세스하는 동안 variable.<variable name>을 사용하고 싶지 않습니다. 그들을 수정하는 동안 variable.<variable name>을 사용하면 사용자의 입력에 따라 한 번만 수정 한 다음 여러 파일에 여러 번 액세스 할 수 있으므로 문제가되지 않습니다.

지금 내 질문은 main.py에있는 변수를 모두 test.py으로 수정 한 후 variable. 프리픽스없이 사용하는 것입니다.

+1

''변수 가져 오기 * '를하면'변수 '모듈의 이름을 로컬 변수에 추가합니다 따라서 네임 스페이스는 가져 오기가 발생할 때 변수의 값을 가리 킵니다.이제 원래 모듈을 변경하면 해당 변경 사항은 가져온 기호에 반영되지 않습니다. – dhke

+0

@dhke 그래, 내가 그 두 변종의 작업에서 이해했다. 그러나 제 질문은 다소 다릅니다. – RatDon

+2

[관련 질문] (http://stackoverflow.com/questions/4758562/modifying-a-variable-in-a-module-imported-using-from-import). [좋은 답변] (http://stackoverflow.com/a/4764225/6525140). – mhoff

답변

2

달성하고자하는 것은 불가능합니다. from MODULE import *은 모든 변수 이름과 값을 네임 스페이스로 가져 오지만 변수 자체는 가져 오지 않습니다. 변수는 로컬 네임 스페이스에 할당되므로 값을 변경하면 해당 변수가 원래 위치에 반영되지 않습니다. 그러나 가져올 수있는 값은 기본적으로 인스턴스에 대한 참조이기 때문에 변경 가능한 개체의 변경 내용이 반영됩니다.

위 구조를 사용하는 규정되지 않은 가져 오기가 권장되지 않는 이유는 이것이 많은 이유 중 하나입니다. 대신 프로그램 구조와 디자인 결정에 의문을 제기해야합니다. 방대한 양의 모듈 수준 변수로 작업하면 장기간에 매우 불편하고 성가 시게 될 수 있습니다.

클래스를 사용하는 등 응용 프로그램에보다 구조화 된 접근 방식을 사용하는 것에 대해 생각해보십시오.

다시 말하지만 본질적으로 동일한 문제를 해결하는 this thread에게 크레딧을 제공하고 싶습니다. 완성도를 위해서


편집. 가능하지만이 방법은 권장되지 않습니다. 비 참조 변수에 수정 사항을 적용 할 때마다 모듈을 다시 가져와야합니다 :

from variable import * # optional 
from test import trial 

if __name__ == "__main__": 
    trial() 
    from variable import * # simply re-import the variables... 
    print my_var