https://docs.python.org/3/tutorial/modules.html#importing-from-a-package

from package import *

실제 동작은 __init__.py와 __all__ 정의에 달려있다.

핵심 동작

  • 패키지의 __init__.py에 __all__ 리스트가 있으면, 그 안에 적힌 이름만 import 대상이 된다.
__all__ = ["echo", "surround", "reverse"] → 이 세 서브모듈만 가져옴.
  • __all__이 없으면 :
    • __init__.py에서 정의된 함수/변수/클래스
    • 이미 다른 import로 로드된 서브모듈(예: 직전에 import sound.effects.echo가 실행된 경우 echo도 포함) 포함된다.
    • 존재하는 모든 파일을 디렉터리 스캔해서 자동 로드하지 않는다.
  • __all__에 있는 이름이 __init__.py 내부 정의로 가려질(shadow) 수도 있어요. 이름이 겹치면 모듈이 아니라 내부 정의가 바인딩됩니다.

권장사항

  • 와일드카드 *는 가독성과 충돌 문제 때문에 실무 코드에서는 지양하고, 필요한 서브모듈/이름을 명시적으로 적는 from package import module 또는 import package.module를 권장합니다.
  • 굳이 *를 지원하려면 패키지 작성자가 __all__를 유지관리해야 하고, 이름 충돌(섀도잉)에 주의

from package import *가 하위 모듈/패키지까지 포함되게 하려면, 자동 스캔은 없으니 패키지의 __init__.py에서 명시적으로 노출해야 합니다.

  • 가장 명확: __all__에 하위 모듈 이름을 나열하고, 그 모듈들을 미리 import해 두세요.
# package/__init__.py
    __all__ = ["sub1", "sub2"]
    from . import sub1, sub2

이렇게 하면 from package import *가 sub1, sub2를 모두 가져옵니다.

  • __all__ 없이도 가능하지만, __init__.py에서 직접 import해서 네임스페이스에 올려둔 하위 모듈만 포함됩니다. 안 가져오면 빠집니다.
  • 깊은 하위까지 필요하면 상위 __init__.py에서 적절히 import하거나, 하위 __init__.py에서도 __all__/import를 설정해 단계별로 노출하세요.

← python 3.14으로