인재 DB 등록 시 유의사항

CLOSE

채용공고 지원 시 유의사항

CLOSE
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
작성자 차단하기 (이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

Python 3.9 에서 추가된 것들

onevirus 21.09.13
671 5 1

서론

Python 3.9 는 2020년 10월 5일 최초 릴리즈 된 후, 현재 3.9.7 까지 릴리즈되었습니다.
AWS Lambda 에서도 2021년 8월 16일부터 python3.9 runtime 을 지원하기 시작했습니다.
3.9 에서 추가된 기능들중 개인적으로 관심있는 기능들 위주로 설명드리겠습니다.

 

Dictionary 의 merge 와 update 오퍼레이터 추가

dict 를 merge 할 수 있는 (|) 연산자와 update 할 수 있는 (|=} 가 추가되었습니다.
merge 연산자의 경우 아래처럼 사용합니다.
아래의 key2 처럼 동일한 키가 양쪽 operand 에 존재할 경우 right operand 의 값이 유지 됩니다.

x = {"key1": "value1 from x", "key2": "value2 from x"}
y = {"key2": "value2 from y", "key3": "value3 from y"}
print(x | y)
print(y | x)
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

이전 버전에서는 dict 를 merge 하려면 {**x, **y} 같은 unpacking operator 를 사용해야 했습니다. 하지만 이는 아름답지 않고, dictionary like 타입을 dict 로 변경되는 문제가 있었습니다. 아래 예제를 보시면 defaultdict 타입이 unpacking operator 를 사용하면 dict 로 변경되어 key error 가 발생하지만, merge 오퍼레이터를 사용할 경우 기존 타입이 유지되어 정상적으로 default value 를 반환하게 됩니다.

from collections import defaultdict

d1 = defaultdict(lambda: "default value")
d1["k1"] = "v1"
d1["k2"] = "v2"
print((d1|x)["k3"])
default value
print({**d1, **x}["k3"])
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

/var/folders/tf/4vq39ht95y73yz8p4hmgbl5w0000gn/T/ipykernel_20779/3627143645.py in 
----> 1 print({**d1, **x}["k3"])


KeyError: 'k3'

아래처럼 설정값을 로딩할 때, 우선 순위를 적용할 경우 편하게 이용할 수 있습니다.
settings = DEFAULT_SETTINGS | USER_SETTINGS | CLI_SETTINGS

 

Type Hint Generic 의 표준 컬렉션 지원

아래 처럼 typing 의 List 나 Dict 를 import 하지않고, 바로 list, dict 를 타입 힌트에 이용할 수 있습니다.

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

 

zoneinfo 모듈 추가

pytz 를 사용하지 않고, 표준 모듈은 zoneinfo 에서 datetime.tzinfo 구현체를 제공합니다.

from zoneinfo import ZoneInfo
from datetime import datetime, timedelta

dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Asia/Seoul"))
print(dt)
print(dt.tzname())
2020-10-31 12:00:00+09:00
KST

 

str의 removeprefix, removesuffix 메소드 추가

문자열의 prefix 나 suffix 제거는 많이 이용한는 패턴이지만 파이선에서 이용하기는 번거로웠습니다.
기존 파이선에서는 re.sub('^' + re.escape(prefix), '', s) 같은 알아보기 힘든 regex 를 이용하거나 여러 줄의 코드를 필요로 했습니다.
python 3.9 부터는 아래처럼 removeprefix 와 removesuffix 를 이용하여 간단히 구현이 가능해졌습니다.

a = "prefix_aaaaaa_suffix"
print(a.removeprefix("prefix_"))
print(a.removesuffix("_suffix"))
print(a.removeprefix("prefix_").removesuffix("_suffix"))
aaaaaa_suffix
prefix_aaaaaa
aaaaaa

 

결론

이 외에도 tls 1.3 의 지원이나 성능향상 등의 변화가 있었습니다. 저희 팀에서는 사용중인 aws lambda runtime 을 모두 python3.9 로 변경했고, 문제없이 이용중입니다. 아직 python 3.9 를 지원하지 않는 파이선 패키지들이 일부 있어서 큰 프로젝트에서 사용하기는 문제가 있어보이지만 aws lambda 처럼 간단한 경우에는 사용하기 무리 없어보입니다.

onevirus 님의 최신 블로그

더보기

관련 블로그