2010-03-25 2 views
6

나는 서브 패키지 utils (즉, 함수가있는 모듈을 각각 포함하는 서브 패키지)을 가진 파이썬 패키지 mymodule을 가지고 있습니다. 함수는 그들이 살고있는 파일/모듈과 같은 이름을 가지고있다.같은 이름의 파이썬 모듈에서 함수/클래스 가져 오기

나는 다음과 같은 기능에 액세스 할 수 있도록하고 싶습니다

,

from mymodule.utils import a_function

은 이상하게도하지만, 때로는 내가 할 수 없습니다 그러나 다른 시간을 위의 표기법을 사용하여 기능을 가져올 수 있습니다. 내가 왜 비록 (최근에, 예를 들어, 나는 함수와 그 이름을 바꾸어서이 이름을 utils.__init__.py 파일에 반영했지만 더 이상 함수가 아니라 (모듈이 아닌) 하나의 함수로 가져왔다. 내 스크립트.

utils.__init__.py

__all__ = ['a_function', 'b_function' ...] 
from a_function import a_function 
from b_function import b_function 
... 

mymodule.__init__.py

utils

아이디어에 대한 참조가 없습니다, 같은 것을 읽어?

답변

7

은 유틸 함수가 필요합니까 다른 유틸리티 기능 가져 오기? (또는 다른 유틸리티 기능을 가져 오는 다른 모듈을 가져옵니다). 예를 들어 a_function.py에 "from mymodule.utils import b_function"이 포함되어 있다고 가정합니다.

a_function 모듈이 처음 utils.py을 가져옵니다
# interpreter is executing utils.py 
# Right now, utils.a_function and utils.b_function are modules 

# The following line executes the a_function module, 
# then rebinds a_function to a_function.a_function 
from a_function import a_function 

# The following line executes the b_function module, 
# then rebinds b_function to b_function.b_function 
from b_function import b_function 

이 utils.b_function이 모듈이 아닌 기능입니다 : 여기에 추가 의견의 무리와 함께 당신의 utils.py입니다. 마지막 행이 실행되기 전에 "mymodule.utils import b_function"을 말하는 모듈은 b_function 함수 대신 b_function 모듈에 대한 참조로 끝납니다.

일반적으로 from somemodule import something 관용구는 모든 대형 프로젝트에서 위험을 안고 있습니다. 짧은 스크립트에는 적합하지만 일단 순환 가져 오기 종속성을 도입하기 시작하면 문제가 발생하고이를 사용하는 위치를 신중히 고 려해야합니다.

입력시 안전과 절약 간의 절충안으로 from mymodule import utils을 사용하고 utils.a_function()으로 전화하십시오. 이렇게하면 가져 오는 동안 utils.a_function에 바운드 된 개체 대신 항상 utils.a_function에 바인딩 된 개체가 표시됩니다.이 표시됩니다.

+0

그래서'import mymodule.utils as utils'와'from mymodule import utils'의 차이점은 무엇입니까? –

+0

@Mike DeSimone : 좋은 지적입니다. 그에 따라 내 대답을 업데이 트되었습니다. –

관련 문제