2014-04-05 2 views
1

파이썬 모듈은 필요한 경우에만 초기화됩니다. 이 사실의 사용은 이러한 방식으로 모듈 사이에 상태를 공유 할 수 있습니다 :모듈을 사용하여 상태를 공유 할 수 있습니까?

# a.py 
import random 
state = { 'foo' : random.random() } 

# b.py 
from a import state 

# c.py 
from a import state 

것은 안전 B의 '상태'와 항상 b와 c가 실행되면 동일한 인스턴스를 참조 c는 것을 가정하는 것입니다 같은 과정?

+0

현재 : 상태 공유에 대한 귀하의 목적은 무엇입니까? 합법적 인 이유가 있지만, 일반적으로 이런 종류의 것은 나쁜 생각입니다. –

+0

필자는 응용 프로그램의 다른 부분에서 사용되는 파이썬 라이브러리를 작성했습니다. 가져 오기 시간에 라이브러리는 라이브러리의 일부 기능 작동에 영향을주는 몇 가지 구성을 읽습니다. 나는 어디서나 똑같은 행동을하도록해야합니다. – smatting

+0

합리적인 것 같습니다. 필자가 설정 파일을 읽는 라이브러리를 좋아하지는 않지만 (앱에서 그렇게하지 않는 한), 때로는 가장 실용적인 접근 방법입니다. –

답변

3

확장/C1phr의 대답은 명확하게하려면 둘 다 A, B,도 C는 state에 새로운 값을 할당하지 않기 때문에 세 가지 모듈에서

state만큼 같은 객체를 참조 할 것. 세 모듈 중 하나라도 state = <something else>을 수행하면 동기화되지 않습니다. 모듈을 값을 변경 (예 : state['blah'] = 'stuff')하여 새 값을 지정하지 않아도됩니다.

C1phr이 말한 것처럼 a.state (bc에서)과 같이 변수를 항상 포함하는 모듈을 통해 변수를 참조하여이를 방지 할 수 있습니다.

이론적으로 하나의 모듈을 다시로드하여 변수를 동기화 해제 할 수있는 방법이 있지만 일반적이지 않거나 바람직하지 않을 수 있습니다. 예를 들어 누군가가 reload(a)을 수행하면 a이 다시로드되고 b 및 c는 이에 대해 알 수 없습니다. 그러나 이것은 비정상적인 일입니다. 또한 모듈이 imported twice via different paths 일 수 있으므로 두 버전을 추적하지 않은 경우 변수 처럼 보이지 않을 수도 있습니다. 그러나 같은 모듈을이 방법으로 두 번 가져 오는 것은 어쨌든 항상 실수입니다.

1

변수와 함수는 가져올 때 파이썬에서 똑같이 취급되므로이 작업은 가능하지만 변수는 새로운 네임 스페이스에 복사됩니다. 상태의 값을 변경하기 전까지는 괜찮습니다. 변경 한 네임 스페이스에만 반영됩니다. 읽기 및 쓰기 권한을 얻으려면 다음을 사용하는 것이 가장 좋습니다.

import a 

그런 다음

MY_VAR = a.state 

와 변수를 액세스하고 설정

a.state = MY_NEW_STATE 

참조 : https://stackoverflow.com/a/1086705/2047504

+3

"변수가 새 네임 스페이스에 읽기 전용 항목으로 복사됩니다."라는 내용은 정확하지 않습니다. 새 네임 스페이스에 새 변수가 만들어져 이전 네임 스페이스의 개체를 가리 킵니다. 새 네임 스페이스에서 이러한 변수의 새 값을 설정할 수는 있지만 이전 네임 스페이스의 변수 값에는 영향을 미치지 않습니다. (이것은 링크 된 질문에서 설명합니다.) – BrenBarn

+0

a.py가 다시로드되어 '상태'의 새 인스턴스를 생성하게되는 상황이 있다면 제가 물어 보았습니다. 위의 패턴이 관용적이거나 너무 위험한 경우라면 궁금합니다. – smatting

+0

@ smatting : 안전합니다. –

관련 문제