Python 3.3+ 패키지에는 __init_.py가 필요하지 않습니까?
Python 3.5.1을 사용하고 있습니다.문서와 패키지 섹션은 https://docs.python.org/3/tutorial/modules.html#packages에서 읽었습니다.
이제 저는 다음과 같은 구조를 가지고 있습니다.
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
, 그럼 에 있는 /home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
찬가로, 재재folderfolderfolderfolder의 :Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
사실, 난 모든 걸 할 수 있어.
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
게게왜 동동?요.__init__.py
은 파(빈)))))))))) files files files files files files files files files files files files files files files.a
★★★★★★★★★★★★★★★★★」b
★★★★★★에module.py
가 Python을 때 수 .Playground
폴??
이것은 Python 2.7에서 변경된 것 같습니다.
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
★★★★★★★★★★★★★★★★ __init__.py
~/Playground/a
★★★★★★★★★★★★★★★★★」~/Playground/a/b
정상적으로 동작합니다.
개요
@Mike의 대답은 맞지만 너무 부정확하다.Python 3.3+는 Implicit Namespace Packages를 지원하며, 이 패키지는 Python 3.3+를 사용하지 않고 패키지를 만들 수 있습니다.__init__.py
파일. 이것은 이름 공간 패키지라고 불리며, 일반 패키지와는 대조적으로__init__.py
파일(비어 있거나 비어 있지 않음).
그러나 네임스페이스 패키지는 필요한 경우에만 생성해야 합니다.대부분의 사용 사례 및 개발자의 경우 이 내용은 적용되지 않으므로 어떤 경우에도 EMTY 파일을 사용해야 합니다.
네임스페이스 패키지 사용 사례
두 가지 유형의 python 패키지의 차이를 설명하기 위해 다음 예를 보겠습니다.
google_pubsub/ <- Package 1
google/ <- Namespace package (there is no __init__.py)
cloud/ <- Namespace package (there is no __init__.py)
pubsub/ <- Regular package (with __init__.py)
__init__.py <- Required to make the package a regular package
foo.py
google_storage/ <- Package 2
google/ <- Namespace package (there is no __init__.py)
cloud/ <- Namespace package (there is no __init__.py)
storage/ <- Regular package (with __init__.py)
__init__.py <- Required to make the package a regular package
bar.py
google_pubsub
★★★★★★★★★★★★★★★★★」google_storage
한 네임스페이스를 합니다.google/cloud
네임스페이스를 하려면 , 의 각 패키지로 할 「네임스페이스 패키지입니다.google/
★★★★★★★★★★★★★★★★★」cloud/
네임스페이스 패키지를 작성하기 위한 유일한 사용 사례여야 합니다.그렇지 않으면 필요 없습니다.
__init__py
파일google
★★★★★★★★★★★★★★★★★」google/cloud
두 디렉토리를 네임스페이스 패키지로 해석할 수 있도록 합니다.Python 3.3+ 에서는, 검색되고 있는 패키지명과 일치하는 이름의 디렉토리는, 그 패키지에 공헌하는 모듈 및 서브 패키지로 인식됩니다.그 결과, 양쪽을 Import 할 때google_pubsub
★★★★★★★★★★★★★★★★★」google_storage
는 이들을 수 Python 인터프리터는 Python 인터프리터입니다.
이는 모든 부분이 동일한 디렉토리 계층에 존재함을 의미하는 자체 포함 패키지인 일반 패키지와 다릅니다.패키지를 Import 했을 때 Python 인터프리터가 서브디렉토리를 검출했을 경우sys.path
an __init__.py
그러면 해당 디렉토리 외부에 있는 적절한 이름의 서브디렉토리가 모두 검색되지 않고 해당 디렉토리의 모듈만 포함하는 단일 디렉토리 패키지가 생성됩니다.이것은 네임스페이스를 공유하지 않는 패키지의 경우라면 문제 없습니다.Python's Import System의 Traps for the Unwarary를 살펴보고 Python Import가 일반 및 네임스페이스 패키지에서 어떻게 동작하는지 더 잘 이해하도록 권장합니다.__init__.py
주의해야 할 함정입니다.
요약
- " "만 건너뜁니다"
__init__.py
파일(네임스페이스 패키지를 작성할 수 있습니다.서로 다른 위치에 있는 서로 다른 라이브러리를 가지고 있고 각각이 상위 패키지(예: 네임스페이스 패키지)에 하위 패키지를 제공하려는 경우에만 네임스페이스 패키지를 생성하십시오. - 빈칸을 합니다.
__init__.py
99%의 경우 일반 패키지를 만들고 싶어하기 때문에 디렉토리로 이동합니다.또한 Python 툴은 다음과 같습니다.mypy
★★★★★★★★★★★★★★★★★」pytest
가__init__.py
파일주의하지 않으면 이상한 오류가 발생할 수 있습니다.
자원.
제 답변은 일반 패키지와 네임스페이스 패키지의 작동 방식에 대해서만 언급하고 있습니다.자세한 내용은 다음 리소스를 참조하십시오.
- PEP 420 -- 암묵적인 네임스페이스 패키지
- Import 시스템 - 일반 패키지
- Import system - 네임스페이스 패키지
- Python의 Import System에서 불필요한 사용자를 위한 트랩
Python 3.3+는 Implicit Namespace Packages를 가지고 있습니다.이 패키지는, Python 3.3+가 없는 패키지를 작성하는 것을 가능하게 합니다.__init__.py
filename을 클릭합니다.
를 허가하는 은, 「네임스페이스 패키지」를 것을 합니다.
__init__.py
파일이 완전히 폐기되어 영향을 받을 수 있습니다.
예전 방식대로라면__init__.py
파이썬 2의 노래입니다.
「 」가 setup.py
해서 '아까운명하다.find_packages()
에 '아까', '아까', '아까', '아까', '아까', '아까',__init__.py
모든 디렉토리에 파일을 저장하여 패키지를 자동으로 검색합니다.
은, 에, 「 」 「 」 「 」 「 」가 포함되어 경우 입니다.
__init__.py
UPD: 암묵적인 네임스페이스 패키지를 사용하는 경우__init__.py
하시면 됩니다.find_namespace_packages()
대신에
...은한다.을 생략해야 한다고 생각합니다.__init__.py
암묵적인 네임스페이스 패키지가 필요한 경우에만 사용합니다.의미를 모르면 아마 원하지 않을 것이기 때문에 계속 사용할 필요가 있습니다.__init__.py
파이썬 3호
3. python 3.3+, python 3.3+는 비어있는 python 3.3+입니다.__init__.py
여전히 필요할 때가 있다.서브폴더를 패키지로 참조하는 경우가 있습니다.를 들면, 「 」를 했을 때, 「 」는 「 」입니다.python -m test.foo
하게 만들 __init__.py
테스트 폴더 아래에 있습니다.3.6.6으로 하다이것은 최신 버전입니다.
별도로 코드 에도 빈 코드가 .__init__.py
츠키노
언급URL : https://stackoverflow.com/questions/37139786/is-init-py-not-required-for-packages-in-python-3-3
'programing' 카테고리의 다른 글
포어치 루프 내의 반복 횟수 (0) | 2022.10.18 |
---|---|
Composer 설치 경로를 지정하는 방법 (0) | 2022.10.18 |
GeoLocation 유형의 폐쇄 인스턴스를 사용하여 할당을 한정해야 합니다. (0) | 2022.10.18 |
별도의 CREATE TABLE 없이 SELECT 문에 임시 테이블을 만듭니다. (0) | 2022.10.18 |
vue 프로젝트에서 이미지를 사전 로드하는 방법 (0) | 2022.10.18 |