파이썬 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을 참고하세요.