표준 import 순서:
1. 표준 라이브러리 모듈
2. third-party 라이브러리 모듈
3. 현재 프로젝트의 로컬 모듈
import os.path
# os.path 사용 코드
import concurrent.futures
from flask import render_template
# futures, render_template 사용 코드
import requests
# requests 사용 코드
import concurrent.futures
import os.path
import requests
from flask import render_template
import this_project.widgets
<package>.<module>.<submodule>
)import package.other_module
import package.other_module
를 해야 하면, from ..other_module import foo
로 임포트 할 수 있다.from ... import. ...
형식이어야 한다.import foo
는 항상 absolute import로 간주된다.from foo import bar
로 작성하면, 모듈의 namespace에 bar라는 이름이 바인딩된다.(?바인딩?)Python programming FAQ에서는 절대 상대경로를 사용하지 말라고 나온다.
# 내 위치: package.sub_package.module
# package.other_module을 import 하고 싶을 때
# 아래와 같이 하지 말자
from ...package import other_module
# 내 위치: package.sub_package.anoter_sub_package.module
# package.other_module을 import 하고 싶을 때
import package.other_module
import package.other_module as other # as를 사용해서 더 짧은 이름을 사용할 수도 있다
*를 사용해서 import 하면 네임스페이스가 복잡해진다
현재 파일에서 정의한 이름과 import한 패키지에 정의되어 있는 이름이 같아서 충돌이 발생할 수도 있다.
그럼 만약 foo라는 패키지에서 엄청 많은 이름들을 import 해야 하면 어떻게 해야 할까? (괄호)를 사용해서 import statments를 그룹화할 수 있다.
아니면 더 단순하게 그냥import foo
로 임포트 해도 된다.
from foo import *
from foo import (bar, baz, qux, quux, quuux)
# 추천
import foo
라이브러리를 사용할 때, 사용자의 컴퓨터에서 특정 패키지가 있는지 확인할 때 import가 되고 사용가능하면 그 패키지가 있는거고, 안된다면 다른 대체 패키지를 사용해야 한다.
try/except 를 사용해서 확인해보면 된다. 만약 exception이 발생하면, 그 패키지는 존재하지 않는 거고 대체 패키지를 사용해야 한다.
import cProfile
# 만약 cProfile이 설치되어 있지 않으면, 에러가 발생한다.
print(cProfile.__all__)
try:
import cProfile as profiler
except:
import profile as profiler
print(profiler.__all__)
특정 모듈이나 패키지로부터 많은 수의 import를 해야 하는 경우
from django.db.models import A, B, C, D,
from django.db models import E, F, G
from django.db.models import (A, B, C, D,
E, F, G)