2011-04-27 7 views
2

내 모듈이 모두 하나의 큰 파일로 유지 관리가 어려워졌습니다. 어떤 일을 깨뜨리는 표준 방법은 무엇입니까?파이썬 모듈이 너무 커짐

은 내가 이런 식으로 가져올 파일 my_module.py, 하나 개의 모듈이 :

import my_module 

"my_module"곧 바로 모든 것을 유지하기 위해 내 능력의 한계를 추진하고 천 명 선이 될 것입니다. 나는 그런

from my_module_base import * 
from my_module_blah import * 
# etc. 

my_module.py 교체, 다음 등 파일 my_module_base.py, my_module_blah.py을 추가, 그리고 생각하고 있었는데, 사용자 코드를 변경할 필요가 없습니다 :

import my_module # still works... 

이 표준 패턴인가?

답변

4

모듈이 실제로 무엇을하는지에 따라 다릅니다. 일반적으로 모듈의 내부에 '__init__.py''파일이있는 디렉토리를 만드는 것이 좋습니다. 따라서 먼저 your_module.pyyour_module/__init__.py과 같은 형식으로 변환해야합니다.

은 그 후에 당신은 당신의 비즈니스 논리에 따라 계속합니다. 다음은 몇 가지 예 :

  • utils.py

  • 데이터베이스를 처리하거나 데이터베이스를 나타내는 몇 가지 수업을해야합니까라고 일부 파일에 넣어 직접 모듈 API에 의해 사용되지 않는 유틸리티 기능을 수행 모델은

  • models.py에 넣어 당신이 settings.py 또는 config.py

  • 전화가 몇 가지 추가 파일에 넣어 의미를 수있는 몇 가지 내부 구성을해야합니까

이 바로 예 (재사용 가능한 애플 리케이션 ^^의 장고 접근 방식에서 도난 조금)입니다. 말했듯이, 당신의 모듈이하는 일은 많이 다릅니다. 나중에 너무 크다면 서브 모듈을 만들어야합니다 (하위 디렉토리로는 __init__.py).

+0

누군가 내 모듈을 가져 오면,'__init __. py'가 소스가되는 것 외에 어떤 일이 발생합니까? 없다면''__init __. py'에''blah import * '와 같은 문장을 넣을 수 있습니까? –

+0

당신은 이것을 할 수는 있지만 여기에 언급 된 바와 같이 그것은 좋은 습관이 아닙니다. 그것이 더 나은 방법에 대한 아래의 Senthil Kumaran의 대답을보십시오. 'import my_module'을 할 때 모듈이 외부에 제공해야하는 것을 가져옵니다. 그 밖의 모든 것은 모듈 로직 내부에 숨겨져 있어야합니다. –

2

내가이에 대한 의견을 많이가 있습니다 확신 해요,하지만 난 당신이 패키지에 포함 된 더 잘 정의 된 기능 단위 (모듈)로 그것을 깰 말할 것입니다. 그럼 당신은 사용

from mypackage import modulex 

그런 다음 객체를 참조하는 패키지 이름을 사용

modulex.MyClass() 

당신은 (거의) 그 이후

from mypackage import * 

를 사용해서는 안 버그가 생길 수 있습니다 (다른 모듈의 중복 된 이름은 결국 하나의 충돌을 일으 킵니다).

+0

답장을 보내 주셔서 감사합니다. 나는 내 질문에 대해 잘 말하지 않았다. 최근 수정 사항을 확인하십시오. –

+0

좋습니다. 그러나 사용자는 모든 것을 필요로합니까? 언젠가는 전환을 위해 모든 것을 끌어 당기는 추가, 하위 호환성 모듈을 제공 할 수 있습니다. 이것은 거의 예외입니다. ;-) – Keith

+0

항상 적절한 것은 아니지만'from mypackage import modulex as mx' 또는 다른 짧은 이름을 사용할 수도 있습니다. – Wilduck

1

아니요, 표준 패턴이 아닙니다. from something import *은 일반적으로 의도하지 않은 많은 것을 가져 오기 때문에 좋은 연습이 아닙니다. 그 대신 동일한 접근법을 따르되, 모듈을 구체적으로 포함하십시오.

def myfunc이있는 경우 base.py에서 'from base import myfunc So that for your users, main.myfunc'도 사용할 수 있습니다. 물론 순환 가져 오기를 수행하지 않도록주의해야합니다.

또한 from something import *이 필요한 경우 __all__ 구문을 사용하여 가져 오기 값을 제어하십시오.

관련 문제