__future__ — 미래 문(statement) 정의

future — 미래 문(statement) 정의

from __future__ import feature 형태의 import를 미래 문(future statement) 이라고 불러요. 이들은 파이썬 컴파일러가 특별히 처리해서, 해당 기능이 표준이 되기 전에 미리 그 기능을 쓸 수 있게 해 줘요. 쉽게 말하면 "이 기능이 정식으로 들어오기 전에 시험 삼아 켜두는 스위치" 같은 역할이에요.

이런 미래 문은 컴파일러에게 특별한 의미를 부여받지만, 실제로는 일반 import 문과 똑같이 실행돼요. __future__ 모듈도 다른 모듈처럼 import 시스템이 똑같이 다뤄줘요. 이런 설계에는 세 가지 목적이 있어요.

  • import 문을 분석하는 기존 도구가 혼동되지 않도록 하려는 것
  • 호환되지 않는 변경이 언제 도입되고 언제 필수가 되는지를 문서화하려는 것. 이건 실행 가능한 문서(executable documentation)라서 import __future__ 후 내용을 살펴보는 걸로 프로그램적으로 확인할 수 있어요
  • 미래 문이 파이썬 2.1 이전 릴리스에서 적어도 런타임 예외를 내도록 보장하려는 것 (2.1 이전엔 그 이름의 모듈이 없어서 import가 실패해요)

출처: Python documentation

본문

모듈 내용 (Module Contents)

__future__에서 어떤 기능 설명도 삭제되지 않아요. 파이썬 2.1에서 도입된 이후 다음 기능들이 이 메커니즘을 통해 언어에 들어왔어요.

feature optional in mandatory in effect
__future__.nested_scopes 2.1.0b1 2.2 PEP 227: Statically Nested Scopes
__future__.generators 2.2.0a1 2.3 PEP 255: Simple Generators
__future__.division 2.2.0a2 3.0 PEP 238: Changing the Division Operator
__future__.absolute_import 2.5.0a1 3.0 PEP 328: Imports: Multi-Line and Absolute/Relative
__future__.with_statement 2.5.0a1 2.6 PEP 343: The "with" Statement
__future__.print_function 2.6.0a2 3.0 PEP 3105: Make print a function
__future__.unicode_literals 2.6.0a2 3.0 PEP 3112: Bytes literals in Python 3000
__future__.generator_stop 3.5.0b1 3.7 PEP 479: StopIteration handling inside generators
__future__.annotations 3.7.0b1 Never [1] PEP 563, PEP 649

class __future__._Feature

__future__.py의 각 문장은 이런 형태예요.

FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                       CompilerFlag)

여기서 보통 OptionalRelease는 MandatoryRelease보다 작고, 둘 다 sys.version_info와 같은 형태의 5-튜플이에요.

(PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 PY_MINOR_VERSION, # the 1; an int
 PY_MICRO_VERSION, # the 0; an int
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 PY_RELEASE_SERIAL # the 3; an int
)
  • _Feature.getOptionalRelease(): 그 기능이 처음 받아들여진 릴리스를 기록해요.
  • _Feature.getMandatoryRelease(): 아직 도래하지 않은 MandatoryRelease라면 그 기능이 언어의 일부가 될 릴리스를 예측한 값이에요. 이미 지났다면 그 기능이 언어에 포함된 시점을 기록하고, 이후 릴리스에서는 미래 문 없이도 그 기능을 쓸 수 있어요. None일 수도 있는데, 이는 계획된 기능이 빠졌거나 아직 결정되지 않았다는 뜻이에요.
  • _Feature.compiler_flag: 동적으로 컴파일되는 코드에서 그 기능을 켜기 위해 내장 함수 compile()의 네 번째 인자로 넘겨야 하는 (비트필드) 플래그예요. _Feature 인스턴스의 compiler_flag 속성에 저장돼요.

[1] from __future__ import annotations는 원래 파이썬 3.10에서 필수가 될 예정이었지만 연기되고 결국 취소됐어요. 이 기능은 결국 deprecated되고 제거될 예정이에요. PEP 649와 PEP 749를 참고하세요.

참고: Future statements (컴파일러가 미래 import를 어떻게 다루는지), PEP 236 - Back to the __future__ (이 메커니즘의 원래 제안).

더 알아보기 (Learn more)