๐Ÿ [Python] Assert ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ ๊ฐ์‹ธ๊ธฐ

์Šน์ค€ยท2021๋…„ 4์›” 11์ผ
0

Background

์ด ๊ธ€์€ Python Tricks The Book ์ด๋ผ๋Š” ์ฑ… 2์žฅ์— ์†Œ๊ฐœ๋˜๋Š” ํŒŒ์ด์ฌ์˜ Assertion ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์ฝ๋‹ค๋ณด๋ฉด ์ข…์ข… Assertion ๊ตฌ๋ฌธ์„ ๋งŒ๋‚˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ ์ด ๊ตฌ๋ฌธ์ด ์–ธ์ œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ˜น์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ์€ ์ฑ…์˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ Assertion ๊ตฌ๋ฌธ์„ย ์–ธ์ œย ๊ทธ๋ฆฌ๊ณ ย ์–ด๋–ป๊ฒŒย ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Study

Assertion

Assertion ๊ตฌ๋ฌธ์€ ์–ด๋–ค ์กฐ๊ฑด์„ ํ…Œ์ŠคํŠธํ•˜๋Š”ย ๋””๋ฒ„๊น… ๋ณด์กฐ ๋„๊ตฌย ๋ผ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” assert ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ์—์„œ ํ• ์ธ ์ฟ ํฐ ๊ธฐ๋Šฅ์„ ์‹œ์Šคํ…œ์— ์ถ”๊ฐ€ํ•˜๊ณ , ๋‹ค์Œ๊ณผ๊ฐ™์€ย apply_discountย ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

def apply_discount(product, discount):
  price = int(product['price'] * (1.0 - discount))
  assert 0 <= price <= product['price']
  return price

์˜๋„๋Œ€๋กœ๋ผ๋ฉด, ์ด ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐ๋œ ๊ฐ€๊ฒฉ์€ 0์›๋ณด๋‹ค ๋‚ฎ์„ ์ˆ˜ ์—†๊ณ , ํ• ์ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜์˜ ๊ฐ€๊ฒฉ๋ณด๋‹ค ๋†’์œผ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ผ๋ฉด, ํ• ์ธ์œจ(discount)์ด 0์ด์ƒ 1์ดํ•˜์˜ ๋ฒ”์œ„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋‹น์—ฐํ•˜๊ฒŒ๋„ ํ• ์ธ๋œ ๊ฐ€๊ฒฉ์ด assert ๊ตฌ๋ฌธ์˜ ์กฐ๊ฑด์„ ์ฐธ์œผ๋กœ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ํ• ์ธ์œจ(discount)์ด 0์ด์ƒ 1์ดํ•˜์˜ ๋ฒ”์œ„๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์–ด๋–จ๊นŒ์š”? ์˜ˆ๋ฅผ๋“ค๋ฉด ํ• ์ธ์œจ์ด 2๊ฐ€ ๋˜๋ฉด, price๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ƒํ’ˆ์„ ์‚ฌ๋Š” ๊ณ ๊ฐ์—๊ฒŒ ๋ˆ์„ ๋” ์ค˜์•ผ ๋ฉ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ assert ๊ตฌ๋ฌธ์—์„œ๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ์— assert ๊ตฌ๋ฌธ์˜ ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด ๋˜๋ฏ€๋กœย AssertionError๋ผ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ž์‹ ์ด ์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋‚ด์— Assertion ๊ตฌ๋ฌธ์ด ์—†์—ˆ๋‹ค๋ฉด, ์‡ผํ•‘๋ชฐ์„ ์šด์˜ํ•˜๋Š” ๋„์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๋””๋ฒ„๊น… ํ•˜๋Š”๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ, Assertion ๊ตฌ๋ฌธ์„ ์ ์ ˆํ•˜๊ฒŒ ์œ„์น˜์‹œ์ผœ ๋ฒ„๊ทธ ์ƒํ™ฉ์‹œ์—ย AssertionErrorย ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์œ„์น˜์— ๋Œ€ํ•œ ์ŠคํƒํŠธ๋ ˆ์ด์Šค(stacktrace)๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Assertion ๊ตฌ๋ฌธ์ด ๊ฐ€์ง€๋Š” ํž˜์ž…๋‹ˆ๋‹ค.

๐Ÿค” ์ผ๋ฐ˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€ ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€?

Assertion ๊ตฌ๋ฌธ์€ ์ผ๋ฐ˜์ ์ธย if๊ตฌ๋ฌธย try - exceptย ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉดย File-Not-Found์™€ ๊ฐ™์€ ์˜ˆ์ƒ๋˜๋Š” ์—๋Ÿฌ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ํ™œ์šฉ ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์€ ์˜ˆ์ƒํ•˜์ง€ ์•Š์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋˜๋Š”๋ฐ, ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ํŠน์ง•์œผ๋กœ ๋น„์ถ”์–ด ๋ณผ ๋•Œ, Assertion ๊ตฌ๋ฌธ์ด ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด ์•„๋‹Œย ๋””๋ฒ„๊น… ํ™˜๊ฒฝย ์— ๋„์›€์„ ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ํ† ๋Œ€๋กœ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ ํŽธ์•ˆํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“‘ ๋ฌธ๋ฒ•

assert_stmt ::= "assert" expression1 [",", expression2]

expression1์€ ํ…Œ์ŠคํŠธ ์กฐ๊ฑด์ด๊ณ , ๋’ค์˜ย expression2๋Š” ํ…Œ์ŠคํŠธ ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ผ ๋•Œ, ์˜ˆ์™ธ์˜ ๋ฉ”์‹œ์ง€๋กœ ์ „๋‹ฌํ•  ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

๐Ÿšจ ์ฃผ์˜ ์‚ฌํ•ญ

์œ„์˜ ๋ฌธ๋ฒ•์„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ํ•ด์„ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ฐ„๋‹จํ•œ ํ† ๋ง‰์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ฒŒ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

if __debug__:
  if not expression1:
    raise AssertionError(expression2)

์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด ์•„๋‹Œ ๋””๋ฒ„๊น… ํ™˜๊ฒฝ์— ๋„์›€์„ ์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์•ผ๋งŒ ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Assertion ๊ตฌ๋ฌธ์€ย __debug__๋ผ๋Š” ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์‚ฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ „์—ญ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ํ•ญ์ƒ ์ฐธ์ด์ง€๋งŒ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ฑฐ์ง“์ด ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, Assertion ๊ตฌ๋ฌธ์„ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์— ์ž˜๋ชป ํ™œ์šฉํ•˜๊ฒŒ๋œ๋‹ค๋ฉด, ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค๋ฉด ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ•˜๋Š”๋ฐ Assertion ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”?

def delete_product(prod_id, user):
  assert user.is_admin(), 'Must Be Admin'
  assert store.has_product(prod_id), 'Unknown product'
  store.get_product(prod_id).delete()

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ผ๋ฉดย __debug__ย ์ „์—ญ๋ณ€์ˆ˜๋Š” ์ฐธ์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ถŒํ•œ ํ™•์ธ๊ณผ ์ œํ’ˆ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง„ํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด,ย PYTHONOPTIMIZE์™€ ๊ฐ™์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์œผ๋กœ ์ธํ•ด Assertion ๊ตฌ๋ฌธ์ด ๋น„ํ™œ์„ฑํ™”๊ฐ€ ๋œ๋‹ค๋ฉด ์œ„์˜ ํ•จ์ˆ˜๋Š” ์˜๋„์™€ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฒŒ ๋  ๊ฒƒ์ด๊ณ  ์ด๋Š” ํฐ ์žฅ์• ๋กœ ๊ท€๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ, ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์‹œ์— Assertion ๊ตฌ๋ฌธ์„ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์—์„œ๋Š”ย ifย ๊ตฌ๋ฌธ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ ˆ๋Œ€ ์‹คํŒจํ•˜์ง€ ์•Š๋Š” ๋‹จ์–ธ๋ฌธ์„ ์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

assert(1 == 2, 'This should fail')

์œ„์˜ ๋‹จ์–ธ๋ฌธ์€ ์ ˆ๋Œ€ ์‹คํŒจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด, ํŠœํ”Œ์€ ๋น„์–ด์žˆ์ง€ ์•Š๋Š”์ด์ƒ ํ•ญ์ƒ ์กฐ๊ฑด์ด ์ฐธ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ง๊ด€์ ์ด์ง€ ๋ชปํ•œ ๋™์ž‘ ๋•Œ๋ฌธ์— ์‹ค์ˆ˜๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค.

assert (
  counter == 10,
  'It should ave counted all the items'
)

์œ„์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ์„œ Assertion ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ ์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์— ์ฃผ์˜๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ฃผ์˜์‚ฌํ•ญ๋“ค์ด ์žˆ๋”๋ผ๋„ ํŒŒ์ด์ฌ์˜ Assertion ๊ตฌ๋ฌธ์€ ์ ์žฌ์ ์†Œ์— ์žฌ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ณผ์ •์— ๋งŽ์€ ๋„์›€์„ ์ฃผ์–ด ์ƒ์‚ฐ์„ฑ์„ ๋Š˜๋ฆฌ๋Š”๊ฒƒ์€ ๋ฌผ๋ก  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์ž…๋‹ˆ๋‹ค.

profile
๋‚ด์ผ์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜ค๋Š˜์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค ๐Ÿค—

0๊ฐœ์˜ ๋Œ“๊ธ€