programing

Python 3.3+ 패키지에는 __init_.py가 필요하지 않습니까?

sourcetip 2022. 10. 18. 22:30
반응형

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__.py99%의 경우 일반 패키지를 만들고 싶어하기 때문에 디렉토리로 이동합니다.또한 Python 툴은 다음과 같습니다.mypy ★★★★★★★★★★★★★★★★★」pytest__init__.py파일주의하지 않으면 이상한 오류가 발생할 수 있습니다.

자원.

제 답변은 일반 패키지와 네임스페이스 패키지의 작동 방식에 대해서만 언급하고 있습니다.자세한 내용은 다음 리소스를 참조하십시오.

Python 3.3+는 Implicit Namespace Packages를 가지고 있습니다.이 패키지는, Python 3.3+가 없는 패키지를 작성하는 것을 가능하게 합니다.__init__.pyfilename을 클릭합니다.

를 허가하는 은, 「네임스페이스 패키지」를 것을 합니다.__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

반응형