__init__.py

Published by onesixx on

“Python파일” = 모듈

“폴더” = “python파일”의 집합 = 모듈의 집합 => Package

https://wikidocs.net/1418

Package의 root 디렉토리 = game 폴더

Package의 Sub디렉토리 = sound, graphic, play 폴더

python 3.3 version이상은 __init__.py 파일이 없어도, 패키지로 인식(PEP 420)

__init__.py 활용

해당 “폴더” 가 패키지의 일부임을 인식하도록 하는 역할

     set PYTHONPATH=~/my/py/doit
     python
    >>> import game.sound.echo
    >>> game.sound.echo.echo_test()
    echo
    >>> from game.sound import echo
    >>> echo.echo_test()
    echo 
    >>> from game.sound.echo import echo_test
    >>> echo_test()
    echo

    하지만, from없이 import만 사용할때는 가장 마지막 항목인 echo_test자리에는 반드시 Module 또는 Package여야만 한다.

    >>> import game.sound.echo.echo_test
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'game.sound.echo.echo_test'; 'game.sound.echo' is not a package

    import game을 수행하면 game 디렉터리의 __init__.py에 정의한 것만 참조하므로 에러가 발생한다.

    >>> import game
    >>> game.sound.echo.echo_test()
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    AttributeError: 'module' object has no attribute 'sound'

    패키지 내 모듈을 미리 import

    예1>

    # game/__init__.py
    from .sound import echo
    >>> import game
    >>> game.sound.echo.echo_test()
    echo

    예2>

    # game/__init__.py
    from .sound.echo import echo_test
    >>> import game
    >>> game.echo_test()
    echo

    공통 변수나 함수를 정의

    예>

    # game/__init__.py
    VERSION = 3.5
    
    def print_version_info():
        print(f"The version of this game is {VERSION}.")
    >>> import game
    >>> print(game.VERSION)
    3.5
    >>> game.print_version_info()
    The version of this game is 3.5.

    패키지를 초기화(기본값 설정하기)코드 또는 관련된 설정

    예>

    # game/__init__.py
    print("Initializing game ...")
    >>> import game
    Initializing game ...

    __all__

    • 특정 디렉터리의 모듈을 *를 이용하여 import할 때에는 다음과 같이 해당 디렉터리의 init.py 파일에 all이라는 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다. all로 정의하지 않으면 인식되지 않는다.\
    # __init__.py
    __all__ = ['echo']
    • 여기에서 all이 의미하는 것은 sound 디렉터리에서 * 기호를 사용하여 import할 경우 이곳에 정의된 echo 모듈만 import된다는 의미이다.

    Categories: dash

    onesixx

    Blog Owner

    Subscribe
    Notify of
    guest

    0 Comments
    Oldest
    Newest Most Voted
    Inline Feedbacks
    View all comments
    0
    Would love your thoughts, please comment.x
    ()
    x