파이썬 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
의 랜드마크로 사용된다.