2009-09-05 6 views
72

패키지의 모든 서브 모듈에서 사용할 수 있어야하는 상수를 정의하고 싶습니다. 나는 가장 좋은 장소가 루트 패키지의 __init__.py 파일에 있다고 생각했다. 그러나 나는 이것을 어떻게하는지 모른다. 몇 개의 하위 패키지가 있고 각각에 여러 모듈이 있다고 가정합니다. 이 모듈에서 변수에 어떻게 액세스 할 수 있습니까?__init__.py를 사용하여 전역 변수를 정의 할 수 있습니까?

물론 이것이 완전히 잘못되어 더 나은 대안이 있다면, 나는 그것을 알고 싶습니다.

답변

120

당신은 __init__.py에 넣어 할 수 있어야한다 : 이것을 달성하는 가장 좋은 방법은 어디서나 당신이 그것을 필요에 "설정"모듈에 상수를 정의하고 그것을 가져 오는 것입니다. 이것은 항상 수행됩니다.

mypackage/__init__.py :

MY_CONSTANT = 42 

mypackage/mymodule.py :

from mypackage import MY_CONSTANT 
print "my constant is", MY_CONSTANT 

그런 다음, 수입 인 MyModule : 아직도

>>> from mypackage import mymodule 
my constant is 42 

, 당신이 경우에 일정이 그것들을 별도의 모듈 (constants.py, config.py, ...)에 넣고 패키지 네임 스페이스에 넣고 싶다면 합리적인 (모범 사례, 아마) 것이 좋다.

mypackage/__init__.py

:

from mypackage.constants import * 

그럼에도 불구하고,이 자동으로 패키지 모듈의 네임 스페이스에 상수를 포함하지 않습니다. 패키지의 각 모듈은 여전히 ​​mypackage 또는 mypackage.constants에서 명시 적으로 상수를 가져와야합니다.

+0

그래, 수입해야한다는 말이있다. –

+9

이것은 받아 들여진 대답 일 것입니다. Python 2.5 이상으로 작업하는 경우 [여기] (http://docs.python.org/2/tutorial/modules.html#intra-package-references)에 설명되어있는 것과 마찬가지로 명시 적 상대 가져 오기를 사용할 수도 있습니다. '에서. import MY_CONSTANT' – ThatAintWorking

+0

이 답변은 정확하며 해결 방법이 아닌 직접 해결책을 제공합니다. 이것을 제공해 주셔서 감사 드리며 승인 된 대답이어야합니다. +1 – Hazok

30

당신은 그렇게 할 수 없습니다. 각 모듈의 네임 스페이스에 명시 적으로 상수를 가져와야합니다.

# mypackage/config.py 
MY_CONST = 17 

# mypackage/main.py 
from mypackage.config import * 
+0

그래, 구성 파일은 무엇을 거기 파이썬 2와 3 그래서 여기에 사이에 어떤 차이가있는 모두에 대한 링크입니다 있는지 확실하지 않다 나는 원한다. 방금 __init__.py가 좋은 장소라고 생각했습니다. 당신의 솔루션은 표준 관행처럼 들립니다. 그렇지? –

+0

좋은 지적. 문제는 모든 패키지 모듈의 네임 스페이스에 _automatically_ 배치해야한다는 것이 었는지 몰랐습니다. –

+0

하지만 스크립트가 config.py를 가져올 때마다 내부의 코드가 실행됩니다. config.py 내의 코드를 한 번만 실행하려면 무엇을 권하고 싶습니까? config.py 내의 settings.json 파일을 읽었으며 config.py를 가져올 때마다 open()을하고 싶지 않습니다. – Augiwan

2

어디에서나 전역 변수를 정의 할 수 있지만 정말 나쁜 생각입니다. __builtin__ 모듈을 가져 와서이 모듈에 속성을 수정하거나 추가하면 갑자기 새로운 내장 상수 나 함수가 생깁니다. 사실, 내 응용 프로그램이 gettext를 설치하면 아무것도 가져 오지 않고 모든 모듈에서 _() 함수를 얻습니다. 따라서 이것은 가능하지만 애플리케이션 유형 프로젝트에만 해당되며 재사용 가능한 패키지 또는 모듈에는 해당되지 않습니다.

그리고 아무도이 방법을 권장하지 않을 것입니다. 네임 스페이스에 어떤 문제가 있습니까? 이 응용 프로그램은 버전 모듈을 가지고 있으므로 "global"변수를 사용할 수 있습니다. version.VERSION, version.PACKAGE_NAME

1

config.ini 파일을 사용하여 상수를 사용할 수 있으며 configparser 라이브러리를 사용하여 스크립트에서 구문 분석 할 수 있습니다. . 이렇게 여러 상황에 대한 상수를 가질 수 있습니다. 두 개의 별도의 URL을 요청 매개 변수를 상수가 있다면 예를 들어 너무처럼 레이블 :

mymodule/config.ini 
[request0] 
conn = '[email protected]' 
pass = 'admin' 
... 

[request1] 
conn = '[email protected]' 
pass = 'dinosaur' 
... 

나는 매우 도움이 파이썬 웹 사이트의 문서를 발견했다.파이썬 3

: https://docs.python.org/3/library/configparser.html#module-configparser 파이썬 2의

: https://docs.python.org/2/library/configparser.html#module-configparser

관련 문제