Alert

이 글은 Claude Code의 도움을 λ°›μ•„ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€

TL;DR

  • Python 3.15(PEP 810)λΆ€ν„° lazy ν‚€μ›Œλ“œλ‘œ λͺ…μ‹œμ  μ§€μ—° import κ°€λŠ₯
  • μš©λ„ 3κ°€μ§€: μ‹œμž‘ μ‹œκ°„ μ΅œμ ν™”, νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜ μ „μš© import, μˆœν™˜ import ν•΄κ²°
  • 주의: lazy importλŠ” import μ‹œμ μ— μœ νš¨μ„± 검사λ₯Ό ν•˜μ§€ μ•Šμ•„ λŸ°νƒ€μž„ μ—λŸ¬ μœ„ν—˜

Source


1. lazy importλž€

Python 3.15에 λ„μž…λ˜λŠ” lazy ν‚€μ›Œλ“œλ₯Ό import μ•žμ— 뢙이면, ν•΄λ‹Ή λͺ¨λ“ˆμ„ μ¦‰μ‹œ λ‘œλ“œν•˜μ§€ μ•Šκ³  μ‹€μ œλ‘œ μ ‘κ·Όν•  λ•ŒκΉŒμ§€ μ§€μ—°μ‹œν‚¨λ‹€.

# κΈ°μ‘΄ (eager) β€” import μ‹œμ μ— μ¦‰μ‹œ λ‘œλ“œ
from json import loads
 
# μƒˆλ‘œμš΄ (lazy) β€” μ‹€μ œλ‘œ loadsλ₯Ό μ‚¬μš©ν•  λ•Œ λ‘œλ“œ
lazy from json import loads
lazy import asyncio

λͺ¨λ“ˆ import와 from import λͺ¨λ‘ μ§€μ›ν•˜μ§€λ§Œ, from x import * (star import)와 ν•¨μˆ˜ λ‚΄λΆ€ importμ—λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.


2. μ™œ ν•„μš”ν•œκ°€ β€” 3κ°€μ§€ μš©λ„

1) μ‹œμž‘ μ‹œκ°„ μ΅œμ ν™”

CLI λ„κ΅¬μ—μ„œ --help만 좜λ ₯ν•  λ•Œλ„ 무거운 λͺ¨λ“ˆμ„ μ „λΆ€ λ‘œλ“œν•˜λ©΄ λŠλ €μ§„λ‹€. lazy import둜 μ‹€μ œ ν•„μš”ν•œ μ‹œμ κΉŒμ§€ μ§€μ—°ν•˜λ©΄ 체감 μ‹œμž‘ μ‹œκ°„μ΄ 쀄어든닀.

python -X importtimeμ΄λ‚˜ import-time-waterfall 같은 λ„κ΅¬λ‘œ 느린 importλ₯Ό ν”„λ‘œνŒŒμΌλ§ν•œ λ’€, ν•΄λ‹Ή λͺ¨λ“ˆλ§Œ lazy둜 μ „ν™˜ν•˜λŠ” 방식이 ꢌμž₯λœλ‹€.

2) νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜ μ „μš© import

νƒ€μž… νžŒνŠΈμ—λ§Œ μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆμ„ λŸ°νƒ€μž„μ— λ‘œλ“œν•  ν•„μš”κ°€ μ—†λ‹€. κΈ°μ‘΄μ—λŠ” TYPE_CHECKING κ°€λ“œλ₯Ό μΌμ§€λ§Œ, lazy import둜 더 κ°„κ²°ν•˜κ²Œ ν•΄κ²° κ°€λŠ₯ν•˜λ‹€.

# κΈ°μ‘΄ 방식
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from heavy_module import SomeType
 
# lazy import 방식
lazy from heavy_module import SomeType

3) μˆœν™˜ import ν•΄κ²°

λͺ¨λ“ˆ Aκ°€ Bλ₯Ό importν•˜κ³ , Bκ°€ λ‹€μ‹œ Aλ₯Ό importν•˜λŠ” μˆœν™˜ 의쑴 μƒν™©μ—μ„œ, ν•œμͺ½μ„ lazy둜 λ°”κΎΈλ©΄ μˆœν™˜μ΄ κΉ¨μ§„λ‹€.


3. μ£Όμ˜ν•  점

lazy importλŠ” μ„ μ–Έ μ‹œμ μ— λͺ¨λ“ˆ 쑴재 μ—¬λΆ€λ₯Ό κ²€μ¦ν•˜μ§€ μ•ŠλŠ”λ‹€.

lazy import some_nonexistent_module  # μ—λŸ¬ 없이 톡과
print(some_nonexistent_module)       # 이 μ‹œμ μ—μ„œμ•Ό ImportError λ°œμƒ

μ˜€νƒ€λ‚˜ λˆ„λ½λœ μ˜μ‘΄μ„±μ„ 개발 λ‹¨κ³„μ—μ„œ μž‘μ§€ λͺ»ν•˜κ³  λŸ°νƒ€μž„(ν”„λ‘œλ•μ…˜)μ—μ„œ ν„°μ§ˆ 수 μžˆλ‹€. λŒ€μ‘ 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

  • ν…ŒμŠ€νŠΈ 컀버리지 확보
  • νƒ€μž… 체컀(mypy, pyright) μ‚¬μš© β€” import 였λ₯˜λ₯Ό μ •μ μœΌλ‘œ 감지
  • 개발/ν”„λ‘œλ•μ…˜ ν™˜κ²½μ˜ μ˜μ‘΄μ„± 일치 확인

4. ν•˜μœ„ ν˜Έν™˜μ„±

Python 3.14 μ΄ν•˜μ—μ„œλ„ λ™μž‘ν•˜λ„λ‘ __lazy_modules__ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜λŠ” 방법이 μžˆλ‹€.

__lazy_modules__ = True  # import λ¬Έ μœ„μ— 배치
from json import loads   # 3.15μ—μ„œλŠ” lazy, 3.14 μ΄ν•˜μ—μ„œλŠ” eager

import μ •λ ¬ 도ꡬ가 이 λ³€μˆ˜λ₯Ό μ½”λ“œλ‘œ μΈμ‹ν•΄μ„œ 이후 importλ₯Ό λ¬΄μ‹œν•  수 μžˆλ‹€λŠ” 단점이 μžˆλ‹€.


5. 참고 자료