Whats new in python 3.6

파이썬 3.6에서 달라지는 점

이번주 금요일1에 파이썬 3.6이 발표될 예정이다. 몇 가지 새로워지는 변경사항에 대해 살펴보자.

새 기능들

포맷 문자열 리터럴

str.format()을 사용하던 문자열 포맷팅이 f" ... " 리터럴로 사용할 수 있게 된다. 해당 리터럴 내에서는 { } 내에 현재 스코프의 변수를 이용해서 치환될 수 있다.

name = "John"
greet = f"He said his name is {name}"
print(greet) # "He said his name is John"

width = 10
precision = 4
value = decimal.Decimal("12.34567")
print(f"result: {value: {width}.{precision}}")
# "result:     12.35"
#         ^^^^^ 5

변수 어노테이션

타입 힌트라고 알려진 변수 어노테이션을 명시할 수 있다.

primes: List[int] = []
captain: str # there is no initial value

PEP484에 보다 자세한 명세가 있다. Iterable, Callable 등의 프로토콜 타입 및 제네릭도 쓸 수 있다. 단 이는 어노테이션일뿐이며 파이썬 자체가 정적 타입언어가 되는 것은 아니다.

숫자에 언더스코어 적용 가능

Swift 처럼 숫자 사이에 언더스코어를 넣어 가독성을 향상시킬 수 있게 됐다. 또한 포맷팅에서도 :_x, :,f 등을 이용해서 자리수마다 기호를 공짜로 삽입할 수 있다.

비동기 축약

async for, await 을 리스트 축약 문법에 적용할 수 있다.

result = [i async for i in aiter() if i % 2]

result = [await fun() for fun in funcs if await condition()]

클래스 정의 문법의 단순화

__init_subclass라는 클래스 메소드를 새로 도입하였고, 이를 통해서 서브 클래싱을 통한 새 클래스를 만드는 문법을 단순화할 수 있다.2

그외

파이썬 구현체의 개선점

  • dict 타입의 구현이 PyPy의 그것과 같이 변경되어 더 빠르고 효율적으로 동작하도록 개선됐다. 약 20~25%가량의 메모리가 절약된다.
  • 새로운 프로토콜에 의해 클래스 커스터마이징이 간단해졌다.[^0]
  • 클래스 속성의 정의의 순서가 보존된다.
  • **kwargs의 순서가 함수로 넘겨진 키워드 순서를 보존한다.

표준 라이브러리 개선점

  • 파이썬 3.6부터 asyncio는 안정적인 API로 취급되며, 성능과 기능이 향상되었다.
  • 파일 시스템의 경로 프로토콜은 이제 pathlib을 통해 새롭게 구현되으며, 표준 라이브러리에서 파일 경로에 대해 동작하는 모든 API는 pathlib 기반으로 수정되었다.
  • typing 모듈이 많이 개선되었고, 안정적인 API로 취급된다.
  • tracemalloc 모듈이 크게 개선되었다.
  • datetime 모듈은 로컬 시간대 계산이 보다 명료해졌다.

윈도 환경에서의 개선

  • 파일 시스템과 콘솔 인코딩이 윈도에서도 UTF8로 취급된다.
  • py.exe 런처가 더이상 Python2 를 Python3에 우선하지 않는다.
  • python.exe, pythonw.exe는 이제 260자 이상의 경로를 인자로 받지 않는다.
  • ._pth 파일 포맷이 추가되었고, 이는 강제로 격리되어 레지스트리나 환경변수 룩업을 하지 않는다.
  • python36.zip 파일은 PYTHONHOME의 랜드마크로 사용된다.

  1. https://www.python.org/dev/peps/pep-0494/ 에서 12월 15일이라고 했는데 표준시 기준이라면 이번 주말쯤이 될 듯 하다. 
  2. PEP 487에 정의되어 있다. 공식문서 참고