Python import 문법

gh1224·2022년 11월 17일

import 문법 테스트

테스트에 사용한 소스코드

a/__init__.py

# 내용 없음

a/b.py

def c():
    print("Hello World!")

main.py

# 1번 코드
import a
a.b.c()

# 2번 코드
import a.b
a.b.c()

# 3번 코드
from a import b
b.c()

# 4번 코드
from a import *
b.c()

# 5번 코드
import a.b.c
a.b.c()

# 6번 코드
from a import b.c
b.c()

# 7번 코드
from a.b import c
c()

# 8번 코드
from a.b import *
c()

결과 - 에러가 발생하는 코드

1번 코드

  • __init__.py가 비어있으므로 패키지 a(~= __init__.py)에서 모듈에 접근할 수 있는 방법이 없음
  • 아래 코드를 __init__.py에 추가하면 패키지 a에서 모듈 b를 참조할 수 있음
from . import b
# 또는
import a.b

4번 코드

  • __init__.py가 비어있으므로 패키지 a(~= __init__.py)에서 모듈에 접근할 수 있는 방법이 없음
  • 아래 코드를 __init__.py에 추가하면 import *을 통해 모듈 b를 import할 수 있음
__all__ = ['b']
  • 1번 코드의 방법도 가능

5번 코드

  • import a.b.(...).c처럼 도트 연산자로 나열된 후의 마지막 c는 모듈이나 패키지여야 함
  • 7번 코드(import c)처럼 하나이면 c는 모듈이나 패키지 외에도 모듈 함수/클래스/변수일 수 있음

6번 코드

  • 5번 코드와 같은 이유

참고한 글

생각

  • 멘토링에서 받았던 'urllib 라이브러리에서 아래 코드는 왜 틀린 것인가'라는 질문에는 1번 코드를 이유로 댈 수 있을 듯함.
    (실제로 urllib 패키지의 __init__.py 파일이 비어있었음)
# import urllib.request
import urllib
with urllib.request.urlopen('http://python.org/') as response:
   html = response.read()
  • 파이썬에서 똑같은 것을 import 하는데도 그 방법이 여러가지라 항상 문법이 헷갈렸는데 이 기회에 제대로 정리하게 됐음.
  • 위에서 에러가 발생했던 1/4/5/6번 코드에 대한 이유가 핵심이라고 생각.

0개의 댓글