__init__.py에 코드 추가
-
02-07-2019 - |
문제
django의 모델 시스템이 어떻게 작동하는지 살펴보던 중, 제가 이해하지 못하는 점을 발견했습니다.
나는 당신이 빈 공간을 만든다는 것을 알고 있습니다. __init__.py
파일을 사용하여 현재 디렉터리가 패키지임을 지정합니다.그리고 다음에서 몇 가지 변수를 설정할 수 있습니다. __init__.py
import *가 제대로 작동하도록 말이죠.
하지만 django는 ...에서 여러 가지를 추가합니다.수입 ...명령문을 작성하고 여러 클래스를 정의합니다. __init__.py
.왜?이것만 보면 상황이 지저분해 보이지 않나요?이 코드가 필요한 이유가 있습니까? __init__.py
?
해결책
모든 수입품은 __init__.py
포함된 패키지(디렉토리)를 가져올 때 사용할 수 있습니다.
예:
./dir/__init__.py
:
import something
./test.py
:
import dir
# can now use dir.something
편집하다:언급하는 것을 잊어버렸습니다. __init__.py
해당 디렉터리에서 모듈을 처음 가져올 때 실행됩니다.따라서 일반적으로 패키지 수준 초기화 코드를 배치하기에 좋은 장소입니다.
편집2:dgrant는 내 예에서 발생할 수 있는 혼란을 지적했습니다.~ 안에 __init__.py
import something
패키지에서 필요하지 않은 모든 모듈을 가져올 수 있습니다.예를 들어 다음과 같이 바꿀 수 있습니다. import datetime
, 그런 다음 최상위 수준에서 test.py
이 두 조각 모두 작동합니다.
import dir
print dir.datetime.datetime.now()
그리고
import dir.some_module_in_dir
print dir.datetime.datetime.now()
결론은 다음과 같습니다.에 할당된 모든 이름 __init__.py
, 가져온 모듈, 함수 또는 클래스는 패키지 또는 패키지의 모듈을 가져올 때마다 패키지 네임스페이스에서 자동으로 사용할 수 있습니다.
다른 팁
그것은 실제로 개인적인 취향이며 Python 모듈의 레이아웃과 관련이 있습니다.
다음과 같은 모듈이 있다고 가정해 보겠습니다. erikutils
.모듈이 될 수 있는 방법에는 두 가지가 있습니다. erikutils.py 너의 sys.path
또는 다음과 같은 디렉터리가 있습니다. 에리쿠틸스 너의 sys.path
비어있는 __init__.py
그 안에 파일이 있습니다.그런 다음 다음과 같은 모듈이 있다고 가정해 보겠습니다. fileutils
, procutils
, parseutils
그리고 당신은 그것들이 아래의 하위 모듈이되기를 원합니다 erikutils
.따라서 다음과 같은 .py 파일을 만듭니다. fileutils.py, procutils.py, 그리고 파싱틸스.py:
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
아마도 당신은 fileutils
, procutils
, 또는 parseutils
모듈.그리고 당신이 다음과 같은 새로운 모듈을 만들고 싶지 않다고 가정해 봅시다. miscutils
.그리고 다음과 같이 함수를 호출할 수 있기를 원합니다.
erikutils.foo()
erikutils.bar()
하는 것보다
erikutils.miscutils.foo()
erikutils.miscutils.bar()
그래서 왜냐하면 erikutils
모듈은 파일이 아닌 디렉토리이므로 모듈 내부에서 기능을 정의해야 합니다. __init__.py
파일.
django에서 제가 생각할 수 있는 가장 좋은 예는 다음과 같습니다. django.db.models.fields
.모든 django *Field 클래스는 __init__.py
파일을 장고/db/모델/필드 예배 규칙서.나는 그들이 모든 것을 가설에 집어넣고 싶지 않았기 때문에 이렇게 한 것 같아요. 장고/db/models/fields.py 모델을 몇 개의 하위 모듈(관련.py, files.py, 예를 들어) 만들어진 *Field 정의를 필드 모듈 자체에 고정했습니다(따라서 __init__.py
).
사용하여 __init__.py
파일을 사용하면 내부 패키지 구조를 외부에서 보이지 않게 만들 수 있습니다.내부 구조가 변경되는 경우(예:하나의 fat 모듈을 두 개로 나누었기 때문에) 조정만 하면 됩니다. __init__.py
파일이지만 패키지에 의존하는 코드는 아닙니다.패키지의 일부를 보이지 않게 만들 수도 있습니다.일반적인 용도로 사용할 준비가 되지 않은 경우.
다음을 사용할 수 있습니다. del
명령은 일반적으로 __init__.py
다음과 같이 보일 수 있습니다:
from somemodule import some_function1, some_function2, SomeObject
del somemodule
이제 헤어지기로 결정했다면 somemodule
새로운 __init__.py
아마도:
from somemodule1 import some_function1, some_function2
from somemodule2 import SomeObject
del somemodule1
del somemodule2
외부에서 보면 패키지는 이전과 동일하게 보입니다.