programing

__init__py는 무엇을 위한 것입니까?

javaba 2022. 10. 7. 23:23
반응형

__init__py는 무엇을 위한 것입니까?

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

이전에는 패키지의 필수 부분이었다(새로운 3.3 이상의 "네임스페이스 패키지"가 아닌, 3.3 이전 버전의 "일반 패키지").

여기 서류입니다.

Python은 일반 패키지와 네임스페이스 패키지의 두 가지 유형을 정의합니다.일반 패키지는 Python 3.2 이전에 존재했던 전통적인 패키지입니다.는, , 「 」, 「 」, 「 」를 포함한 디렉토리로 .__init__.py때 이 파일을 합니다. 「 」 「 」 、 「 」,__init__.py파일이 암묵적으로 실행되며, 파일이 정의하는 개체는 패키지 네임스페이스의 이름에 바인딩됩니다.__init__.py파일에는 다른 모듈이 포함할 수 있는 것과 동일한 Python 코드가 포함될 수 있으며 Python은 Import 시 모듈에 몇 가지 속성을 추가합니다.

만 하면 네임스페이스 , 및 패키지는 네임스페이스 패키지가 없는 입니다.__init__.py.

이름: " " "__init__.py디스크상의디렉토리를 파이선 패키지 디렉토리로 마크하기 위해서 사용합니다.만약 당신이files파일이 있는 경웄다.

mydir/spam/__init__.py
mydir/spam/module.py

그리고 그리고.mydir코드를 수입수 있습니다 할은 길에 당신패스상에 있는 경우는에, 코드를 가져올 수 있습니다.module.pyas~하듯이

import spam.module

또는

from spam import module

만약 당신이 를 삭제했을 경우를 제거해__init__.py파일, 파이선이 더 이상 그 디렉터리 안에 submodules에 모듈을 수입하려고 한다 실패할 것이다.파일, Python은 더 이상 해당 디렉토리 내의 서브모듈을 찾지 않으므로 모듈 수입 시도가 실패합니다.

그 그__init__.py파일 보통이지만, 더 편리한 이름의 패키지의 선택된 부분 수출하는데 사용될 수 있고 편의 기능을 가지고 있거나, 등이 텅 비어 있다파일은 보통 비어 있지만 패키지의 일부분을 보다 편리한 이름으로 내보내고 편의 기능을 유지하는 데 사용할 수 있습니다.위의 예임을 감안할 때, init 모듈의 내용 as위의 예에서 init 모듈의 내용은 다음과 같이 액세스 할 수 있습니다 접근할 수 있다.

import spam

이것을 근거로 해서

는 파이선 소포처럼, Python패키지로 디렉토리에라벨을 붙이고를 정의하는 디렉터리 표시.__all__그럼 패키지 수준에서 임의의 변수를 정의할 수 있습니다.패키지가 API와 같은 방법으로 자주 Import되는 것을 정의하는 경우 편리할 수 있습니다.이 패턴은 피토닉의 "평면이 내포된 것보다 낫다" 철학을 고수하도록 촉진합니다.

은 제가 중 입니다.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여기서 아래 구문을 사용하여 새 세션을 시작할 수 있습니다.이 코드는 "데이터베이스" 패키지 디렉토리의 내부 또는 외부에서 실행되는 것과 동일합니다.

from database import Session
session = Session()

, 예를 들면, 「이렇게 하다」를 정의하는 입니다.을 사용하다Session데이터베이스 패키지의 "create_module.py"와 같은 새 파일에 저장하고 다음 명령을 사용하여 새 세션을 시작합니다.

from database.create_session import Session
session = Session()

추가 정보

적절한 용도를 커버하는 꽤 흥미로운 레딧 스레드가 있습니다.__init__.py 삭제:

http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/

라는 이 중론인 것 __init__.py더 나은 .암묵적인 것보다 더 나은" 원칙을 위반하지 않으려면 파일은 매우 얇아야 합니다.

주요 .__init__.py

  1. 편의상: 다른 사용자는 패키지 계층(문서)에서 사용자의 함수의 정확한 위치를 알 필요가 없습니다.

    your_package/
      __init__.py
      file1.py
      file2.py
        ...
      fileN.py
    
    # in __init__.py
    from .file1 import *
    from .file2 import *
    ...
    from .fileN import *
    
    # in file1.py
    def add():
        pass
    

    다른 사용자가 add()를 호출할 수 있습니다.

     from your_package import add
    

    예를 들어 file1의 내부 기능을 모르기 때문에

     from your_package.file1 import add
    
  2. 예를 들어 로깅(최상위 레벨에 배치해야 함)을 초기화하는 경우:

     import logging.config
     logging.config.dictConfig(Your_logging_config)
    

__init__.pyfile은 Python이 자신을 포함하는 디렉토리를 모듈로 취급하도록 합니다.

또한 이 파일은 모듈에 로드되는 첫 번째 파일이기 때문에 모듈이 로드될 때마다 실행할 코드를 실행하거나 내보낼 서브모듈을 지정할 수 있습니다.

.3 Python 3.3부터__init__.pyImport Python을 Import합니다.

PEP 420: Implicit Namespace Packages를 확인합니다.

가 필요 없는 __init__.py여러 경로 세그먼트에 자동으로 확장 가능한 마커 파일(PE 420에 설명된 대로 네임스페이스 패키지에 대한 다양한 서드파티 접근 방식에서 영감을 얻음)

테스트는 다음과 같습니다.

$ mkdir -p /tmp/test_init
$ touch /tmp/test_init/module.py /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
├── module.py
└── __init__.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

$ rm -f /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
└── module.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

★★★★
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packageshttpsdocs.python.org/3/whatsnew/3.3.html#
https://www.python.org/dev/peps/pep-0420/httpswww.python.org/dev/peps//
Python 3 은 __init_ 입니다.py?

은 Python이 동작합니다.__init__.py파일도 포함해야 합니다.

디렉토리가 패키지로 취급되도록 지정되어 있기 때문에 (비어 있는 경우라도) 포함하도록 지정합니다.

.__init__.py 삭제:

다음과 같은 파일 구조를 가지고 있다고 가정합니다.

main_methods 
    |- methods.py

★★★★★★★★★★★★★★★★★.methods.py내용을 담고 있습니다.

def foo():
    return 'foo'

「」를 foo()하다

from main_methods.methods import foo # Call with foo()
from main_methods import methods # Call with methods.foo()
import main_methods.methods # Call with main_methods.methods.foo()

을 간직할 methods.py에 inside inside inside main_methods은 (「」/「」) 「Import」입니다.main_methods.


「」의 했을 경우methods.py로로 합니다.__init__.py ㅇㅇㅇㅇ를 쓰면 요.foo() importing importing를 Import하는 main_methods:

import main_methods
print(main_methods.foo()) # Prints 'foo'

것은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.'__init__.py는 패키지의 일부로 취급됩니다.


일부 Python 패키지는 실제로 이 기능을 제공합니다.예를 들어 JSON을 사용하는 경우입니다.import json Import를 하고 .__init__.py json패키지(여기 패키지 파일 구조 참조):

소스 코드: Lib/json/__init__.py

파이썬Java와 마찬가지로 계층 구조와 디렉토리 구조는 동일합니다., 지지 but but but but but but but but but but but but가 있어야 합니다.__init__.py설명하겠습니다.__init__.py다음 예제를 사용하여 파일을 작성합니다.

package_x/
|--  __init__.py
|--    subPackage_a/
|------  __init__.py
|------  module_m1.py
|--    subPackage_b/
|------  __init__.py
|------  module_n1.py
|------  module_n2.py
|------  module_n3.py

__init__.py존재하는 한 비워둘 수 있습니다.디렉토리가 패키지로 간주되어야 함을 나타냅니다. ★★★★★★★★★★★★★★★★★.__init__.py또한 적절한 내용을 설정할 수도 있습니다.

module_n1에 함수를 추가하는 경우:

def function_X():
    print "function_X in module_n1"
    return

실행 후:

>>>from package_x.subPackage_b.module_n1 import function_X
>>>function_X()

function_X in module_n1 

module_n1을 사용하다 하면 됩니다.__init__.py에는 다음과같이 됩니다.subPackage_b는 다음과 같습니다.

__all__ = ['module_n2', 'module_n3']

실행 후:

>>>from package_x.subPackage_b import * 
>>>module_n1.function_X()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_n1

* Import를 사용하면 는 "* Import"의 .__init__.py★★★★★★ 。

__init__.py한 module합니다.

코드 읽기를 좋아하는 분들을 위해 여기에 투비트 연금술사의 코멘트를 넣겠습니다.

$ find /tmp/mydir/
/tmp/mydir/
/tmp/mydir//spam
/tmp/mydir//spam/__init__.py
/tmp/mydir//spam/module.py
$ cd ~
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
>>> module.myfun(3)
9
>>> exit()
$ 
$ rm /tmp/mydir/spam/__init__.py*
$ 
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named spam
>>> 

다른 python 파일을 쉽게 가져올 수 있습니다.이 파일을 다른 py 파일이 포함된 디렉토리(say stop)에 저장하면 import stop.other 등의 작업을 수행할 수 있습니다.

root\
    stuff\
         other.py

    morestuff\
         another.py

이 없으면 것이이 without__init__.pyPython은 소스코드가 어디에 있는지 몰라 패키지로 인식할 수 없기 때문에 디렉토리 내용 내에서는 other.py을 Import할 수 없습니다.

__init__.py수입하다「 」의 __init__.py내에 합니다.함수 「」는, 「」입니다.a() 할 수 .b.py다음과 같이 합니다.

from b import a

그러나 이 기능이 없으면 직접 가져올 수 없습니다.시스템 경로를 수정해야 합니다.

import sys
sys.path.insert(0, 'path/to/b.py')

from b import a

__init_.py는 API를 중단하지 않고 모듈을 패키지로 변환하거나 외부 네스트 네임스페이스 또는 개인 모듈을 만드는 것을 허용합니다*.이것은 네임스페이스를 확장할 때 도움이 됩니다.

파일 유틸리티가 있는 경우.함유된 파이

def foo():
    ...

는 접속할 수 .foo 함께

from util import foo

후에 유틸리티 함수를 상호작용에 대한 util을 유지하기 위해 가 from util import foo아직 동작하고 있습니다).util.py을 util로 이행할 수 있습니다.

util/
  __init__.py
  util.py
  db.py

및 util/_init_.py do.

from util import *

하지만 이건 중복이에요.util/util.py 파일이 아닌 util 파일을 넣을 수 있습니다.py 콘텐츠는 __init_.py에 저장되며 사용자는 이제 할 수 있습니다.

from util import foo
from util.db import check_schema

좋은지 잘 알 수 생각합니다.util는 "_init_"와 합니다.파이다util 표시

* 이것은 다른 답변에서 암시되지만, 여기서 강조하고 싶습니다.
** 수입체조 채용 부족.파일과 이름이 같은 새 패키지를 만드는 것은 작동하지 않습니다. 참조

Python 2를 사용하고 있고 파일의 형제들을 로드하고 싶다면 파일의 부모 폴더를 세션의 시스템 경로에 추가하면 됩니다.현재 파일이 init 파일인 경우와 거의 동일하게 동작합니다.

import os
import sys
dir_path = os.path.dirname(__file__)
sys.path.insert(0, dir_path)

그 후, 파일의 디렉토리와 관련된 정기적인 Import는 정상적으로 동작합니다.예.

import cheese
from vehicle_parts import *
# etc.

일반적으로는 적절한 init.py 파일을 사용하고 싶지만, 레거시 코드를 다룰 때 특정 파일을 로드하도록 하드 코딩된 라이브러리만 사용해야 할 수도 있습니다.그러한 경우에 이것은 대안이다.

init.py : 패키지 디렉토리에 있는 python 파일로 패키지 또는 패키지 내의 모듈을 Import할 때 호출됩니다.이를 사용하여 패키지 초기화 코드를 실행할 수 있습니다.즉, 패키지가 Import될 때마다 이 폴더의 다른 모듈이 실행되기 전에 python 문이 먼저 실행됩니다.이것은 c나 java 프로그램의 주요 기능과 유사하지만, 이것은 핵심 python 파일이 아닌 python 패키지 모듈(folder)에 존재합니다.또한 모듈을 python 파일로 Import할 때와 마찬가지로 이 init.py 파일에 정의된 글로벌 변수에 액세스할 수 있습니다.

예를 들어 pymodlib라는 폴더에 init.py 파일이 있습니다.이 파일에는 다음 문장이 포함되어 있습니다.

인쇄(f'){name}' pystructures = ['for_loop', 'while_loop', 'ifCondition'에 대해 init.py을 호출하고 있습니다.

솔루션 모듈, 노트북 또는 python 콘솔에 "pymodlib" 패키지를 Import하면 이 두 개의 문이 Import 중에 실행됩니다.따라서 로그 또는 콘솔에 다음과 같은 출력이 표시됩니다.

import pymodlib pymodlib init.py for pymodlib

python console의 다음 문장에서 다음을 수행합니다.글로벌 변수에 액세스할 수 있습니다.

pymodlib.pystructures는 다음과 같은 출력을 제공합니다.

['for_loop', 'while_loop', 'ifCondition']

이제 python 3.3 이후 폴더를 python 모듈로 만들기 위해 이 파일을 사용할 수 있게 되었습니다.python 모듈 폴더에 포함시키는 것을 생략합니다.

언급URL : https://stackoverflow.com/questions/448271/what-is-init-py-for

반응형