파이썬

[python] __init__.py는 무엇을 위한 것입니까?

zooheon 2022. 8. 21. 23:02
반응형

__init__.pyPython 소스 디렉토리의 용도는 무엇입니까 ?

 

그것은 패키지의 필수 부분이었습니다( 이전, 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__.pyPython은 더 이상 해당 디렉토리 내에서 하위 모듈을 찾지 않으므로 모듈 가져오기 시도가 실패합니다.

파일은 일반적으로 비어 있지만 보다 편리한 이름으로 패키지의 선택된 부분을 내보내고 편의 기능을 유지하는 등 의 __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"명시적인 것이 암시적인 것보다 낫다"는 철학을 위반하지 않도록 파일이 매우 얇아야 한다는 것입니다.

 

반응형