2010-03-02 3 views
60

내 프로젝트에서 파이썬의 __init__.py 파일의 사용 시나리오 또는 디자인 목표를 이해하는 데 어려움이 있습니다.__init__.py 사용

내가 '모델'디렉토리가 다음 파일

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py
포함하는 (패키지로 의미)한다고 가정

  1. 내가 solrmodel.py, mongomodel.py, samodel.py에 사용 될 필요가 일반적인 정의를 가지고 :

    나는 __init__.py를 사용하는 두 가지 방법을 발견했다. 모든 * model.py 클래스의 기본/공통 정의로 __init__.py을 사용할 수 있습니까? 즉, model/__init__.py을 가져와야 함을 의미합니다.

  2. 또는, __init__.py 자체에 solrmodel.py, mongomodel.py, samodel.py의 정의를 가져온하며,이 같은 쉬운 클래스의 가져 오기 또는 기능 허용 :

    # file: __init__.py 
    
    from mongomodel import * 
    from solrmodel import * 
    from samodel import * 
    

    (I를

나는 두 가지 시나리오 위 사이에서 결정하지 못했습니다) import *하지 않는 것이 좋습니다 난 그냥 관례로 사용되는 것을 알고 있습니다. __init__.py에 대한 더 많은 사용 시나리오가 있으며 사용법을 설명 할 수 있습니까?

+1

stackoverflow와 (과) 같은 그림이 표시 기준 축소에 문제가있는 것 같습니다. 편집하는 동안 \ __ init__.py가 표시되지만 _init_.py가 표시됩니다. 누군가가 \ __ init__.py 대회를 고칠 수 있습니까? –

+11

백틱을 사용하여 코드 블록에 넣습니다. 예를 들면'\'__init __. py \''와 같습니다. \ _ \ _ init \ _ \ _. py에'\\ _ \\ _ init \\ _ \\ _. py '와 같은 \를 사용하십시오. 밑줄은 기울임 꼴로 사용됩니다. – Ponkadoodle

답변

47

많은 패키지에 초기화 할 항목이 없기 때문에 내가 쓰는 __init__.py 파일의 대부분은 비어 있습니다.

내가 초기화를 원할 수있는 한 가지 예는 패키지로드시에 한 번에 모든 데이터 (파일, DB 또는 웹에서 말함)를 읽는 경우입니다.이 경우 그것의 많이 그 독서를 패키지의 __init__.py에있는 개인 기능에 넣는 것이 아니라, 별도의 "초기화 모듈"을 가지지 않고 그 모듈을 패키지의 모든 단일 실제 모듈에서 중복 가져 오기하는 것입니다 (쓸데없이 반복적이고 오류가 발생하기 쉽습니다. 패키지의 어떤 모듈보다 훨씬 앞서 패키지의 __init__.py이라는 언어의 보증에 의존하는 경우가 훨씬 더 Pythonic입니다!).

의견의 구체적이고 권위있는 표현은 파이썬의 표준 라이브러리에 포함 된 다양한 패키지에서 취한 다양한 접근 방식을 살펴보십시오.

+2

파일 시스템은 __init__.py 안에 모델을 두는 것을 권장합니다. –

+8

개인적으로''__init __. py''에 상당한 코드를 넣지는 않겠지 만, 피할 수있는 깊은 이유는 없습니다 - 순수한 스타일 선택입니다. 파일의 모든 코드가 첫 번째로 실행됩니다 패키지 또는 모듈을 패키지에서 가져올 때 –

+0

장고보기에서 전역 변수에 관한 질문이 있습니다. 내 의견을 제공 할 수 있습니까? http://stackoverflow.com/questions/39490843/django-app-level- 변수 –

22

__init__.py의 내용은 패키지 내에 모듈을 가져올 때 가져옵니다.

일반적인 파트를 별도의 모듈에 넣은 다음 다른 모듈을 가져 와서 패키지 외부에서 사용할 항목을 __init__.py으로 남기는 세 번째 시나리오를 간과하고 있습니다. 이것은 내가 일반적으로 따르는 연습입니다.

+1

나는 꽤 이해하지 못한다. 세 번째 시나리오에 대한 예를 제공해 주시겠습니까? –

+3

@Tyler Long은 별도의 초기화 모듈을 가지고 있어야한다는 것을 의미합니다 (패키지의'__init __. py'에서'bootstrap'을 호출하고'import bootstrap'을 호출하십시오.) – warvariuc

관련 문제