import 문법 테스트
테스트에 사용한 소스코드
a/__init__.py
a/b.py
def c():
print("Hello World!")
main.py
import a
a.b.c()
import a.b
a.b.c()
from a import b
b.c()
from a import *
b.c()
import a.b.c
a.b.c()
from a import b.c
b.c()
from a.b import c
c()
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']
5번 코드
- import a.b.(...).c처럼 도트 연산자로 나열된 후의 마지막 c는 모듈이나 패키지여야 함
- 7번 코드(import c)처럼 하나이면 c는 모듈이나 패키지 외에도 모듈 함수/클래스/변수일 수 있음
6번 코드
참고한 글
생각
- 멘토링에서 받았던 'urllib 라이브러리에서 아래 코드는 왜 틀린 것인가'라는 질문에는 1번 코드를 이유로 댈 수 있을 듯함.
(실제로 urllib 패키지의 __init__.py 파일이 비어있었음)
import urllib
with urllib.request.urlopen('http://python.org/') as response:
html = response.read()
- 파이썬에서 똑같은 것을 import 하는데도 그 방법이 여러가지라 항상 문법이 헷갈렸는데 이 기회에 제대로 정리하게 됐음.
- 위에서 에러가 발생했던 1/4/5/6번 코드에 대한 이유가 핵심이라고 생각.