๊ฐ์
Walrus Operator(:=)๋ Python 3.8์์ ๋์ ๋ ๋์ ์(assignment expression) ์ฐ์ฐ์๋ค. ํํ์ ๋ด์์ ๋ณ์์ ๊ฐ์ ํ ๋นํ๊ณ ๋์์ ๊ทธ ๊ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ
# ๊ธฐ๋ณธ ํํ
๋ณ์๋ช
:= ํํ์
# ๊ดํธ๋ก ๊ฐ์ธ์ ์ฌ์ฉ
(๋ณ์๋ช
:= ํํ์)์ฃผ์ ์ฌ์ฉ ์ฌ๋ก
์กฐ๊ฑด๋ฌธ์์์ ํ์ฉ
๊ธฐ์กด ๋ฐฉ์
data = get_data()
if data is not None:
process_data(data)Walrus ์ฌ์ฉ
if (data := get_data()) is not None:
process_data(data)๋ฐ๋ณต๋ฌธ์์์ ํ์ฉ
ํ์ผ ์ฝ๊ธฐ
# ๊ธฐ์กด ๋ฐฉ์
while True:
chunk = file.read(8192)
if not chunk:
break
process(chunk)
# Walrus ์ฌ์ฉ
while (chunk := file.read(8192)):
process(chunk)๋ฆฌ์คํธ ์ฒ๋ฆฌ
# ๊ธฐ์กด ๋ฐฉ์
numbers = [1, 2, 3, 4, 5]
total = 0
while numbers:
number = numbers.pop()
total += number
# Walrus ์ฌ์ฉ
total = 0
while (number := numbers.pop()):
total += number๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์์์ ํ์ฉ
๋ณต์กํ ๊ณ์ฐ ๊ฒฐ๊ณผ ์ฌ์ฌ์ฉ
# ๊ธฐ์กด ๋ฐฉ์
results = []
for x in range(10):
result = complex_calculation(x)
results.append((result, result ** 2, result ** 3))
# Walrus ์ฌ์ฉ
results = [(y := complex_calculation(x), y ** 2, y ** 3)
for x in range(10)]๊ณ ๊ธ ํ์ฉ ์์
API ์๋ต ์ฒ๋ฆฌ
def handle_api_response():
while (response := api.get_next_page()):
if (errors := response.get('errors')):
log_errors(errors)
continue
if (data := response.get('data')):
process_data(data)๋ฐ์ดํฐ ๊ฒ์ฆ
def validate_user_data(data):
if not (name := data.get('name')):
raise ValueError("Name is required")
if not (age := data.get('age')):
raise ValueError("Age is required")
if not (18 <= age <= 100):
raise ValueError(f"Invalid age: {age}")
return {'name': name, 'age': age}์ ๊ท์ ๋งค์นญ
import re
def extract_version(text):
if (match := re.search(r'version\s+(\d+\.\d+)', text)):
return match.group(1)
return None์ฑ๋ฅ ๋น๊ต
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋น๊ต
# ๊ธฐ์กด ๋ฐฉ์
def process_large_data_old(data):
result = expensive_calculation(data)
return [result, result ** 2, result ** 3]
# Walrus ์ฌ์ฉ
def process_large_data_new(data):
return [(calc := expensive_calculation(data)),
calc ** 2,
calc ** 3]๋น๊ต ๊ฒฐ๊ณผ:
- ๊ธฐ์กด ๋ฐฉ์: ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์ถ๊ฐ ๋ณ์ ํ์
- Walrus ์ฌ์ฉ: ์์ ๋ณ์ ์์ด ์ง์ ๊ฒฐ๊ณผ ์์ฑ
์ฃผ์์ฌํญ
1. ๊ฐ๋ ์ฑ ๊ณ ๋ ค
# ํผํด์ผ ํ ์
if (n := len(x := f())) < 10: print(x)
# ๊ถ์ฅํ๋ ๋ฐฉ์
x = f()
if (n := len(x)) < 10:
print(x)2. ์ค์ฝํ ๊ท์น
# ์ ์ญ ์ค์ฝํ์์๋ ์ฌ์ฉ ๋ถ๊ฐ
(x := 1) # SyntaxError
# ํจ์ ๋ด๋ถ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
def func():
(x := 1)
return x3. ์ค์ฒฉ ์ฌ์ฉ ์ฃผ์
# ํผ๋์ค๋ฌ์ด ์ฝ๋
[(x := i + 1, y := x * 2) for i in range(5)]
# ๋ ๋ช
ํํ ๋ฐฉ์
[(i + 1, (i + 1) * 2) for i in range(5)]์ค์ ํ์ฉ ํ
1. ๋๋ฒ๊น ์ ํ์ฉ
def debug_function(data):
if (result := process_data(data)) is not None:
print(f"Processing result: {result}")
return result
return None2. ๋ก๊น ๊ณผ ํจ๊ป ์ฌ์ฉ
import logging
def process_with_logging(items):
if (n := len(items)) > 1000:
logging.warning(f"Processing large dataset: {n} items")
return process_items(items)๊ฒฐ๋ก
Walrus Operator๋ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ค. ํนํ ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ์ปดํ๋ฆฌํจ์ ์์ ํ์ฉํ ๋ ๊ทธ ์ง๊ฐ๋ฅผ ๋ฐํํ๋ค. ๋ค๋ง, ๊ณผ๋ํ ์ฌ์ฉ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํด์น ์ ์์ผ๋ฏ๋ก ์ ์ ํ ์ํฉ์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.