파이썬 3.6에서 바뀐 점
파이썬 3.6이 방금 전(12월 23일) 정식 출시되었습니다. 이 글에서는 파이썬 3.6에 추가된 문법과 바뀐점을 간략하게 알아보려 합니다. 파이썬 공식 문서의 What’s New In Python 3.6을 참고하였습니다.
새 문법
1. f 문자열 포매팅(PEP 498)
.format()
메서드나 %
를 사용할 때 변수를 죽 늘어놓아야 했던 불편함을 덜 수 있습니다.
>>> lang = 'Python'
>>> author = 'Guido van Rossum'
>>> 'Language: {}, Author: {}'.format(lang, author)
Language: Python, Author: Guido van Rossum
>>> f'Language: {lang}, Author: {author}'
Language: Python, Author: Guido van Rossum
자세한 내용은 파이썬 공식 문서의 2.4.3 Formatted string literals를 참고하세요.
PyCharm에서는 기존 포매팅에서 우클릭하여 Convert to f-string literal
이라는 메뉴를 선택하면, f 문자열 포매팅으로 손쉽게 바꿀 수 있습니다. (PyCharm 블로그 참고)
2. 타입 힌트(PEP 484)
3.5에서는 함수의 전달인자나 리턴 값에만 사용할 수 있었던 타입 힌팅을 변수에도 적용할 수 있습니다.
파이썬은 동적 언어이므로 타입 힌트가 오류 검출 수단으로 사용되는 건 아니지만, PyCharm 등의 서드파티에서 자동 완성시 타입 힌트가 나타나는 등의 방법으로 사용됩니다. (PyCharm 블로그 참고)
>>> value: str
>>> value = 'test str'
>>> value
'test str'
>>> value = 123
>>> value
123
자세한 내용은 파이썬 공식 문서의 PEP 484 -- Type Hints를 참고하세요.
3. 숫자 값에 _
사용(PEP 515)
숫자 값에 밑줄(_
)을 사용할 수 있습니다. 숫자 값을 읽을 때 자릿수 세기의 불편함을 덜 수 있겠습니다.
>>> 1000
1000
>>> 1_000
1000
사람이 직접 넣는 방식이 원시적으로 보인다면, 문자열 포매팅을 사용하면 되고요.
>>> value = 12345678
>>> f'{value:_}'
12_345_678
>>> '{:_}'.format(value) # 기존 포매팅도 됩니다.
자세한 내용은 파이썬 공식 문서의 PEP 515 -- Underscores in Numeric Literals를 참고하세요.
4. async 제너레이터(PEP 525)
async / await 문법을 제너레이터에 사용할 수 있습니다.
import asyncio
async def gen(x):
for i in range(x):
yield i
await asyncio.sleep(1)
자세한 내용은 파이썬 공식 문서의 PEP 525 -- Asynchronous Generators를 참고하세요.
5. async 축약(PEP 530)
리스트 축약, dict 축약과 같은 문법에도 async / await를 사용할 수 있습니다.
# 4. async 제너레이터에서 이어서
result = [i async for i in aiter() if i % 2]
result = [await fun() for fun in funcs if await condition()]
자세한 내용은 파이썬 공식 문서의 PEP 530 -- Asynchronous Comprehensions를 참고하세요.
6. 클래스 정의 문법 단순화(PEP 487)
부모 클래스에 __init_subclass__
를 정의하면, 상속 클래스 정의가 간단해 집니다.
class BlogBase:
def __init_subclass__(cls, name, **kwargs):
cls.name = name
super().__init_subclass__(**kwargs)
class Blog(BlogBase, name="raccoony's cave"):
pass
>>> Blog.name
"raccoony's cave"
자세한 내용은 파이썬 공식 문서의 PEP 487 -- Simpler customisation of class creation를 참고하세요.
새 라이브러리
secrets(PEP 506)
random보다 강화된 난수 생성 라이브러리가 추가되었습니다.
>>> import secrets
>>> secrets.token_bytes(10)
b'\xf6!\x00w\r8\x89\xd7\x93\x80'
>>> secrets.token_hex(10)
'742ae68b333bc3d70048'
>>> secrets.token_urlsafe(10)
'UiT0E-HgthTMGQ'
자세한 내용은 파이썬 공식 문서의 secrets — Generate secure random numbers for managing secrets를 참고하세요.
개선 사항
- dict 타입의 작동 방식이 개선되어, 3.5 버전 대비 20%~25% 정도 메모리가 절약됩니다. PyPy의 작동 방식을 채용했다네요. (New dict implementation)
- 클래스에 정의한 속성들의 순서가 유지됩니다. (PEP 520)
- 전달인자의
**kwargs
에 들어 있는 변수의 순서가 유지됩니다. (PEP 468)
이 외에도 3.6 업데이트와 관련된 자세한 내용은 파이썬 공식 문서의 What’s New In Python 3.6을 참고하세요.
COMMENTS