이미 플랫 패키지를 사용하고 있었기 때문에 중첩 된 패키지에서 발생한 문제를 예상하지 못했습니다. 여기 ...
디렉토리 레이아웃
dir
|
+-- test.py
|
+-- package
|
+-- __init__.py
|
+-- subpackage
|
+-- __init__.py
|
+-- module.py
init .py의 내용
모두 package/__init__.py
와 package/subpackage/__init__.py
비어 있습니다.
의 내용 module.py
# file `package/subpackage/module.py`
attribute1 = "value 1"
attribute2 = "value 2"
attribute3 = "value 3"
# and as many more as you want...
내용 test.py
(3 개 버전)
버전 1
# file test.py
from package.subpackage.module import *
print attribute1 # OK
그것은 사물을 가져 오는 (일괄 가져 오기)의 나쁘고 안전하지 않은 방법이지만 작동합니다.
버전 2
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
from module import attribute1
더 안전한 방법으로 항목별로 가져 오지만 실패합니다. Python은 이것을 원하지 않습니다. "No module named module"메시지와 함께 실패합니다. 그러나…
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
print module # Surprise here
… 말한다 <module 'package.subpackage.module' from '...'>
. 그래서 그것은 모듈이지만 그것은 모듈이 아닙니다 / -P 8-O ... 어
버전 3
# file test.py v3
from package.subpackage.module import attribute1
print attribute1 # OK
이것은 작동합니다. 그래서 당신은 항상 overkill 접두사를 사용하거나 버전 # 1에서와 같이 안전하지 않은 방법을 사용하고 Python에서 안전하고 편리한 방법을 사용하는 것을 허용하지 않습니까? 안전하고 불필요한 긴 접두사를 피하는 더 좋은 방법은 Python이 거부하는 유일한 방법입니까? 그것을 사랑하기 때문이다 import *
하거나 (이 연습을 시행하는 데 도움이되지 않습니다) 너무 긴 접두사를 사랑하기 때문에?
어려운 말로 미안하지만이 멍청한 행동을 해결하려고 노력하는 이틀입니다. 내가 어딘가에서 완전히 틀린 것이 아니라면, 파이썬의 패키지 및 하위 패키지 모델에서 무언가가 정말로 망가 졌다는 느낌이들 것입니다.
메모
- 나는
sys.path
글로벌 부작용을 피하기 위해, 또는 동일한 글로벌 효과*.pth
를 가지고 놀 수있는 또 다른 방법 인 파일 에 의존하고 싶지 않습니다sys.path
. 솔루션이 깨끗하려면 로컬에만 있어야합니다. Python은 하위 패키지를 처리 할 수 있지만 그렇지 않은 경우에도 로컬 작업을 처리 할 수 있도록 전역 구성을 사용할 필요가 없습니다. - 나는 또한에서 가져 오기를 사용해 보았지만
package/subpackage/__init__.py
아무것도 해결하지subpackage
못했고 똑같이 수행 하며 알려진 모듈이 아니라고 불평print subpackage
하고 모듈이라고 말합니다 (이상한 동작).
내가 완전히 틀렸을 수도 있지만 (내가 선호하는 옵션) 파이썬에 대해 많이 실망하게 만듭니다.
내가 시도한 세 가지 외에 다른 알려진 방법이 있습니까? 내가 모르는 것?
(한숨)
----- % <----- 편집 -----> % -----
지금까지의 결론 (사람들의 의견 후)
모든 패키지 참조가 전역 사전으로 이동하기 때문에 Python의 실제 하위 패키지와 같은 것은 없습니다. 즉, 로컬 패키지 참조를 관리 할 방법이 없음을 의미하는 로컬 사전이 없음을 의미합니다.
전체 접두사 또는 짧은 접두사 또는 별칭을 사용해야합니다. 에서와 같이 :
전체 접두사 버전
from package.subpackage.module import attribute1
# An repeat it again an again
# But after that, you can simply:
use_of (attribute1)
짧은 접두사 버전 (하지만 반복되는 접두사)
from package.subpackage import module
# Short but then you have to do:
use_of (module.attribute1)
# and repeat the prefix at every use place
또는 위의 변형입니다.
from package.subpackage import module as m
use_of (m.attribute1)
# `m` is a shorter prefix, but you could as well
# define a more meaningful name after the context
분해 된 버전
한 번에 여러 항목을 일괄 적으로 가져 오는 것이 마음에 들지 않으면 다음을 수행 할 수 있습니다.
from package.subpackage.module import attribute1, attribute2
# and etc.
내가 가장 좋아하는 취향은 아니지만 (수입 법인 당 하나의 수입 명세서를 선호 함) 개인적으로 선호하는 것이 될 수 있습니다.
업데이트 (2012-09-14) :
마침내 레이아웃에 대한 주석을 제외하고는 실제로 괜찮은 것처럼 보입니다. 위의 대신 다음을 사용했습니다.
from package.subpackage.module import (
attribute1,
attribute2,
attribute3,
...) # and etc.