๐ [Python] Assert ์ฌ์ฉํด์ ์ฝ๋ ๊ฐ์ธ๊ธฐ
on
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 ๊ตฌ๋ฌธ์ ์ ์ฌ์ ์์ ์ฌ๋๋ก ์ฌ์ฉํ๊ธฐ๋ง ํ๋ค๋ฉด ๋๋ฒ๊น ํ๋ ๊ณผ์ ์ ๋ง์ ๋์์ ์ฃผ์ด ์์ฐ์ฑ์ ๋๋ฆฌ๋๊ฒ์ ๋ฌผ๋ก ์ ์ง ๋ณด์๊ฐ ์ฌ์ด ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์๊ฒ์ ๋๋ค.