__init__.py
Python 소스 디렉토리의 용도는 무엇입니까 ?
[python] __init__.py는 무엇을 위한 것입니까?
그것은 패키지의 필수 부분이었습니다( 이전, 3.3 이전 "일반 패키지" , 최신 3.3+ "네임스페이스 패키지" 아님).
Python은 일반 패키지와 네임스페이스 패키지의 두 가지 유형의 패키지를 정의합니다. 일반 패키지는 Python 3.2 및 이전 버전에 존재했던 기존 패키지입니다. 일반 패키지는 일반적으로
__init__.py
파일이 포함된 디렉토리로 구현됩니다. 일반 패키지를 가져오면 이__init__.py
파일이 암시적으로 실행되고 이 파일이 정의하는 개체는 패키지의 네임스페이스에 있는 이름에 바인딩됩니다. 파일 은__init__.py
다른 모듈이 포함할 수 있는 것과 동일한 Python 코드를 포함할 수 있으며 Python은 가져올 때 모듈에 몇 가지 추가 속성을 추가합니다.
하지만 링크를 클릭하기만 하면 예제, 추가 정보, 네임스페이스 패키지에 대한 설명이 포함되어 있습니다 __init__.py
. .
명명된 파일 __init__.py
은 디스크의 디렉토리를 Python 패키지 디렉토리로 표시하는 데 사용됩니다. 파일이 있는 경우
mydir/spam/__init__.py
mydir/spam/module.py
경로에 있는 경우 다음 과 같이 mydir
코드를 가져올 수 있습니다.module.py
import spam.module
또는
from spam import module
파일 을 제거하면 __init__.py
Python은 더 이상 해당 디렉토리 내에서 하위 모듈을 찾지 않으므로 모듈 가져오기 시도가 실패합니다.
파일은 일반적으로 비어 있지만 보다 편리한 이름으로 패키지의 선택된 부분을 내보내고 편의 기능을 유지하는 등 의 __init__.py
데 사용할 수 있습니다. 위의 예에서 init 모듈의 내용은 다음과 같이 액세스할 수 있습니다.
import spam
이를 바탕으로
디렉토리에 Python 패키지로 레이블을 지정하고 를 정의하는 것 외에도 패키지 수준에서 모든 변수를 정의할 수 있습니다__all__
. 패키지가 API와 같은 방식으로 자주 가져올 항목을 정의하는 경우 그렇게 하는 것이 종종 편리합니다. 이 패턴은 Pythonic "flat is better than nested" 철학을 준수하도록 촉진합니다.__init__.py
예
다음은 내 데이터베이스와 상호 작용하기 위해 sessionmaker
호출 을 자주 가져오는 내 프로젝트 중 하나의 예입니다 . Session
몇 가지 모듈로 "데이터베이스" 패키지를 작성했습니다.
database/
__init__.py
schema.py
insertions.py
queries.py
내에 __init__.py
는 다음 코드가 포함되어 있습니다.
import os
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
여기에서 정의하므로 Session
아래 구문을 사용하여 새 세션을 시작할 수 있습니다. 이 코드는 "database" 패키지 디렉토리 내부 또는 외부에서 실행되는 것과 동일합니다.
from database import Session
session = Session()
물론 이것은 작은 편의입니다. 대안은 Session
내 데이터베이스 패키지의 "create_session.py"와 같은 새 파일에 정의하고 다음을 사용하여 새 세션을 시작하는 것입니다.
from database.create_session import Session
session = Session()
추가 읽기
여기에 적절한 사용법을 다루는 꽤 흥미로운 reddit 스레드가 __init__.py
있습니다.
http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/
대다수의 의견은 __init__.py
"명시적인 것이 암시적인 것보다 낫다"는 철학을 위반하지 않도록 파일이 매우 얇아야 한다는 것입니다.