๊ฐœ์š”

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 x

3. ์ค‘์ฒฉ ์‚ฌ์šฉ ์ฃผ์˜

# ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ฝ”๋“œ
[(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 None

2. ๋กœ๊น…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ

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๋Š” ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋‹ค. ํŠนํžˆ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ์ปดํ”„๋ฆฌํ—จ์…˜์—์„œ ํ™œ์šฉํ•  ๋•Œ ๊ทธ ์ง„๊ฐ€๋ฅผ ๋ฐœํœ˜ํ•œ๋‹ค. ๋‹ค๋งŒ, ๊ณผ๋„ํ•œ ์‚ฌ์šฉ์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.