3.3 Imports #Writing Idiomatic Python 3.1

oen·2022년 9월 7일
0

1. import 순서

  • 파일의 상단에 위치

표준 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

2. 절대 경로 > 상대 경로

  • absolute imports: sys.path를 기준으로 한 위치 (<package>.<module>.<submodule>)
    • import package.other_module
  • relative imports: 현재 모듈과의 상대적인 위치
    • 만약 내가 지금 package.sub_package.module 모듈에 있고 import package.other_module를 해야 하면, from ..other_module import foo로 임포트 할 수 있다.
    • 점(.) 하나는 모듈이 포함된 현재 패키지를 나타낸다
    • 추가로 점을 계속 붙일 수 있는데(..), 점 하나 당 상위(parent) 패키지를 의미한다.
    • from ... import. ... 형식이어야 한다.
    • import foo 는 항상 absolute import로 간주된다.

    왜 absolute import가 나을까?

    relative import는 모듈의 namespace를 복잡하게 만든다. ???
    만약 from foo import bar로 작성하면, 모듈의 namespace에 bar라는 이름이 바인딩된다.(?바인딩?)
    또한 코드를 읽는 사람이 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를 사용해서 더 짧은 이름을 사용할 수도 있다

3. 모듈의 모든 내용을 가져오기 위한 from foo import * 금지

*를 사용해서 import 하면 네임스페이스가 복잡해진다

현재 파일에서 정의한 이름과 import한 패키지에 정의되어 있는 이름이 같아서 충돌이 발생할 수도 있다.

그럼 만약 foo라는 패키지에서 엄청 많은 이름들을 import 해야 하면 어떻게 해야 할까? (괄호)를 사용해서 import statments를 그룹화할 수 있다.

아니면 더 단순하게 그냥import foo로 임포트 해도 된다.

👎

from foo import *

👍

from foo import (bar, baz, qux, quux, quuux)

# 추천
import foo

4. 패키지가 사용가능한지 보려면 try 블록 사용

라이브러리를 사용할 때, 사용자의 컴퓨터에서 특정 패키지가 있는지 확인할 때 import가 되고 사용가능하면 그 패키지가 있는거고, 안된다면 다른 대체 패키지를 사용해야 한다.

try/except 를 사용해서 확인해보면 된다. 만약 exception이 발생하면, 그 패키지는 존재하지 않는 거고 대체 패키지를 사용해야 한다.

👎

import cProfile
# 만약 cProfile이 설치되어 있지 않으면, 에러가 발생한다.
print(cProfile.__all__)

👍

try:
	import cProfile as profiler
except:
	import profile as profiler
print(profiler.__all__)

5. import를 많이 해야하면 튜플 사용

특정 모듈이나 패키지로부터 많은 수의 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)
profile
🐾

0개의 댓글