Assignment expressions

python 3.8 version에 새로운 연산자가 추가되었다. 이름은 바다코끼리 연산자가 아니고 정식 명칭은 assignment expression이다. 공홈에서는 다음과 같이 소개하고 있다.

There is new syntax := that assigns values to variables as part of a larger expression.
It is affectionately known as “the walrus operator” due to its resemblance to the eyes and tusks of a walrus.
(click here for more info!) > 📑

그렇다. 공홈에서 바다코끼리 연산자라고 얘기하고 있으니 지금부터 이녀석을 바다코끼리라고 칭하겠다. 지금부터 이 연산자를 이해해보자!

파이썬에서 변수에 값을 선언할 때 다음과 같은 흐름을 따른다.

=을 기준으로
1. 왼쪽에는 변수(variable)
2. 오른쪽에는 (value)을
3. 표현(expression)함으로써 변수에 값을
4. 할당(assignment)한다.

코드로 보면 다음과 같다.

from datetime import datetime
start = datetime.now()

그렇다면 바다코끼리는 어떤 역할을 하길래 "더 큰 표현식"으로써 변수에 값을 할당한다는 애매하고도 이해하기 어려운 말을 하는걸까?

오늘도 한가지 상황을 생각해보자

파이썬은 if문의 condition expression 내에서 새로운 변수를 선언할 수 없다.

a = "안녕하세요"
if (n = len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

위와 같이 코딩하면 무조건 SyntaxError: invalid syntax를 조우하게 될 것이다. 일반적인 경우 case1처럼 condition expression 밖에서 먼저 변수를 선언하고 조건문에 활용한다. 하지만 case2와 같이 n이라는 변수를 condition expression 안에서 선언하고 또 if문 내에서 사용할 수 있게 만들어주는 녀석이 바로 바다코끼리이다.

a = "안녕하세요 저는 johnywhisky입니다"
# case 1
n = len(a)
if n > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
# case 2
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
# case1과 2는 동일한 결과를 보여준다.

콜론 하나만 추가하면 실행 가능한 코드가 된다는 뜻이다.

이게 끝이 아니다!

a = "안녕하세요"
if (n := len(a)) > 10:
    print(sentence := f"List is too long ({n} elements, expected <= 10)")
print(n)
# 결과 = 5

조건을 만족하지 않기 때문에 if문 안의 print는 실행되지 않았지만 if문 밖에서 n의 값을 확인할 수 있다. 그리고 if의 condition expression 안에서만 사용할 수 있는것이 아니다.

a = "안녕하세요 저는 johnywhisky입니다"
if (n := len(a)) > 10:
    print(sentence := f"List is too short ({n} elements, expected >= 10)")
print(n, sentence)

이처럼 print문 안에서 사용해 if문 밖에서도 활용할 수 있다. 즉, 이전에는 변수를 선언 할 수 없는 상황에서 할 수 있게 만들어주는 녀석이 바다코끼리 연산자이다.

room_contants = [{
    "deposit"          : float((sale_info := room.sale_info.first()).deposit),
    "monthly_pay"      : float(sale_info.monthly_pay),
    "sale_type"        : sale_info.sale_type.name,
    } for room in room_list]

이런식으로 list comprehension 안에서 dict type의 element를 표현할 때도 사용할 수 있다.

결론

Assignment expression을 정리하자면 다음과 같다.

:=을 기준으로
1. 왼쪽에 있는 변수(variable)에
2. 오른쪽의 표현(expression)을
3. (value)으로써
4. 할당(assignment)함과 동시에
5. 표현(expression)으로써의 기능을 수행하게 해준다.

profile
1년차 Backend Developer입니다.

0개의 댓글