Python 3.8 업데이트 내역

2020년 7월 3일 수정

이 글은 Python 3.8의 업데이트 내역을 간략히 정리한다.

The Walrus 오퍼레이터

:= 오퍼레이터가 추가되었다. 머리를 왼쪽으로 90도 눕혀서 보면 눈(코?)과 긴 이빨이 꼭 바다코끼리 처럼 보이는데 그래서 바다코끼리(Walrus) 오퍼레이터라고 불린다.

이 오퍼레이터는 함수의 실행 결과가 있는 경우, 즉 None 이 아닌 값이 반환된 경우 이를 변수에 받아서 바로 액세스할 수 있는 문법을 제공한다.

if (result := some_work()):
    do_process(result)

위 예제에서 some_work() 의 반환 값이 None 이 아니면 if 문 아래의 블록에 진입한다. 그리고 result 라는 변수에 반환 값이 그대로 전달되어서 사용할 수 있다. 물론 이 result 변수는 이 if 블록이 끝나는 순간 사용할 수 없다.

마치 Swiftif let 구문과 용도가 비슷한데, 실제 활용도도 비슷한 것 같다. 예를 들어 루프나 Python List Comprehension 등에서도 사용할 수 있다.

F-string 기능 추가

디버깅 용도로 변수의 값을 출력하기 위해 아래와 같은 경우를 사용할 수 있다.

print(f"some_var={some_var}")

3.8부터는 위 코드를 아래처럼 축약해서 적을 수 있다.

print(f"{some_var=}")

많이 편해진 것 같다.

/ 오퍼레이터

매개변수를 특징(?)을 분리하기 위해 / 오퍼레이터가 추가되었다. 예를 들어 아래 코드의 경우

def f(a, b, /, c, d, *, e, f):
    pass

매개변수가 좀 독특하게 선언되어 있다.

우선 처음의 a, b 는 일반적인 매개변수다.

그 다음은 /* 사이에 매개변수가 위치하는데, 여기 안쪽은 보통 함수의 매개변수 선언과 동일한 방식으로 사용할 수 있다는 표식이다.

그런데 * 뒤쪽은 키워드 표기법만 사용 가능하다. 즉 필드 이름을 반드시 표기해야 한다.

그래서 위 함수는 아래처럼 호출할 수 있다.

f(1, 2, 3, d=4, e=5, f=6)

얼마나 쓰일지는 잘 모르겠다. 개인적으로는 필드 이름을 강제하는 것을 선호하기 때문에 그렇게 느낄 수도 있다.