🐍 νŒŒμ΄μ¬μ—μ„œ assert vs raise μ™„λ²½ κ°€μ΄λ“œ

SueΒ·2025λ…„ 8μ›” 5일
0

Effective Python

λͺ©λ‘ 보기
5/9
post-thumbnail

🐍 νŒŒμ΄μ¬μ—μ„œ assert vs raise μ™„λ²½ κ°€μ΄λ“œ

νŒŒμ΄μ¬μ—μ„œ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λŠ” λ°©λ²•μ—λŠ” μ—¬λŸ¬ κ°€μ§€κ°€ μžˆμ§€λ§Œ,
κ°€μž₯ 자주 μ‚¬μš©λ˜λŠ” 것이 assert 와 raise μž…λ‹ˆλ‹€.

λ‘˜μ€ λΉ„μŠ·ν•΄ λ³΄μ΄μ§€λ§Œ μš©λ„μ™€ λ™μž‘ 방식이 λ‹€λ¦…λ‹ˆλ‹€.
이 κΈ€μ—μ„œλŠ” assert와 raise의 차이, 상황별 μ‚¬μš©λ²•, 그리고 μ‹€μ „ 예제λ₯Ό 톡해 κ°œλ…μ„ μ •λ¦¬ν•©λ‹ˆλ‹€.


βœ… 1. assert β€” λ””λ²„κΉ…μš© 쑰건 검사

πŸ“Œ κ°œλ…

  • assert 쑰건, "μ—λŸ¬ λ©”μ‹œμ§€"
  • 쑰건이 κ±°μ§“(False) 이면 AssertionErrorλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨μ΄ 잘λͺ»λœ μƒνƒœλ‘œ μ§„ν–‰λ˜λŠ” 것을 막기 μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

🧩 예제

x = 10
assert x > 0, "xλŠ” μ–‘μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€"   # βœ… 톡과
assert x < 0, "xλŠ” μŒμˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€"   # ❌ AssertionError: xλŠ” μŒμˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€

βœ… νŠΉμ§•

  • 디버깅 λ‹¨κ³„μ—μ„œ μƒνƒœ 검증을 μœ„ν•΄ μ‚¬μš©.
  • python -O (μ˜΅ν‹°λ§ˆμ΄μ¦ˆ λͺ¨λ“œ) 둜 μ‹€ν–‰ν•˜λ©΄ assertκ°€ λ¬΄μ‹œλ©λ‹ˆλ‹€.
  • λ”°λΌμ„œ ν”„λ‘œλ•μ…˜ μ½”λ“œ(μ‹€μ œ μ„œλΉ„μŠ€)μ—μ„œλŠ” λ‚¨μš©ν•˜λ©΄ μ•ˆ 됨.

βœ… 2. raise β€” λͺ…μ‹œμ  μ˜ˆμ™Έ λ°œμƒ

πŸ“Œ κ°œλ…

  • raise μ˜ˆμ™Έ("μ—λŸ¬ λ©”μ‹œμ§€")
  • κ°œλ°œμžκ°€ 직접 νŠΉμ • μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
  • λͺ¨λ“  μ˜ˆμ™Έ νƒ€μž…(ValueError, TypeError, μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ λ“±)κ³Ό ν•¨κ»˜ μ‚¬μš© κ°€λŠ₯.

🧩 예제

x = -5
if x < 0:
    raise ValueError("xλŠ” 음수일 수 μ—†μŠ΅λ‹ˆλ‹€")  # ❌ ValueError: xλŠ” 음수일 수 μ—†μŠ΅λ‹ˆλ‹€

βœ… νŠΉμ§•

  • 항상 μ‹€ν–‰ β†’ μ΅œμ ν™” μ˜΅μ…˜κ³Ό 관계없이 μž‘λ™.
  • μ˜ˆμ™Έλ₯Ό λͺ…ν™•νžˆ μ œμ–΄ν•  수 μžˆμ–΄ ν”„λ‘œλ•μ…˜ μ½”λ“œμ—μ„œ ꢌμž₯.
  • try-except와 ν•¨κ»˜ μ‚¬μš© κ°€λŠ₯.

βœ… 3. assert vs raise β€” 차이 ν•œλˆˆμ— 보기

ꡬ뢄assertraise
λͺ©μ λ””λ²„κΉ…μš© 쑰건 검사λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έ λ°œμƒ
μ˜ˆμ™Έ νƒ€μž…ν•­μƒ AssertionErrorλ‹€μ–‘ν•œ μ˜ˆμ™Έ(ValueError, TypeError, μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ)
μ‹€ν–‰ ν™˜κ²½μ΅œμ ν™” λͺ¨λ“œ(-O)μ—μ„œ λΉ„ν™œμ„±ν™”λ¨ν•­μƒ 싀행됨
μ‚¬μš© μ‹œκΈ°λ””λ²„κΉ…, ν…ŒμŠ€νŠΈν”„λ‘œλ•μ…˜ μ½”λ“œ, μ˜ˆμ™Έ 처리 둜직

βœ… 4. assert와 raise ν•¨κ»˜ μ‚¬μš©ν•˜κΈ°

두 κ°œλ…μ€ μƒν˜Έ λ³΄μ™„μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 개발 쀑: assert둜 λΉ λ₯Έ 검증
  • 운영 쀑: raise둜 λͺ…μ‹œμ  μ˜ˆμ™Έ 처리

🧩 예제

def process_value(x):
    assert isinstance(x, int), "xλŠ” int νƒ€μž…μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€"  # λ””λ²„κΉ…μš©
    if x < 0:
        raise ValueError("xλŠ” 음수일 수 μ—†μŠ΅λ‹ˆλ‹€")         # ν”„λ‘œλ•μ…˜μš©
    return x * 2

print(process_value(5))    # βœ… 10
print(process_value(-3))   # ❌ ValueError

βœ… 5. assert와 isinstance ν•¨κ»˜ μ‚¬μš©

μ•žμ„œ 배운 isinstanceλ₯Ό ν™œμš©ν•˜λ©΄ νƒ€μž… 검증이 더 λͺ…ν™•ν•©λ‹ˆλ‹€.

def greet(name):
    assert isinstance(name, str), "name은 λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€"  # λ””λ²„κΉ…μ—μ„œλ§Œ 체크
    return f"Hello, {name}!"

βœ… 6. evalκ³Ό assert의 예제 연계

assertλ₯Ό μ΄μš©ν•΄ eval(repr(obj)) == obj 관계λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

a = '\x07'
b = eval(repr(a))
assert a == b   # βœ… True β†’ repr 결과둜 볡원 κ°€λŠ₯
  • assertλŠ” 이 관계가 항상 참인지 ν™•μΈν•˜λŠ” 디버깅 μ•ˆμ „μž₯치 역할을 ν•©λ‹ˆλ‹€.

βœ… 7. μ‹€μ „μ—μ„œ raise의 ν™œμš©

  • μ‚¬μš©μž μž…λ ₯ 검증
  • API μ˜ˆμ™Έ 처리
  • μ»€μŠ€ν…€ μ˜ˆμ™Έ ν΄λž˜μŠ€μ™€ ν•¨κ»˜ μ‚¬μš©
class CustomError(Exception):
    pass

def check_value(x):
    if x != 42:
        raise CustomError("정닡은 42μ—¬μ•Ό ν•©λ‹ˆλ‹€!")

check_value(10)  # ❌ CustomError λ°œμƒ

🎯 정리

  • βœ… assert
    β†’ λ””λ²„κΉ…μš©μœΌλ‘œ 쑰건을 확인, μ‹€νŒ¨ μ‹œ AssertionError λ°œμƒ
    β†’ ν”„λ‘œλ•μ…˜μ—μ„œλŠ” λΉ„ν™œμ„±ν™”λ  수 μžˆμœΌλ‹ˆ 주의

  • βœ… raise
    β†’ λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έ λ°œμƒ, λ‹€μ–‘ν•œ μ˜ˆμ™Έ νƒ€μž… μ‚¬μš© κ°€λŠ₯
    β†’ 운영 ν™˜κ²½μ—μ„œλ„ 항상 μž‘λ™ β†’ μ˜ˆμ™Έ 처리의 핡심


profile
AI/ML Engineer

0개의 λŒ“κΈ€