Assertion یا تاکید
Assertion در پایتون ابزاری برای بررسی صحت و درستی شرایط در زمان اجرای برنامه است. این قابلیت به عنوان یک شرط صحتسنجی استفاده میشود تا مطمئن شویم که فرضیات یا ورودیها در نقاط مختلف کد برقرار هستند. در صورت برقرار نبودن شرط، یک استثنای AssertionError ایجاد میشود.
۱. ساختار پایه assert
# ساختار ساده
assert condition
# با پیام خطا
assert condition, "Error message"
۲. مثال ساده
print(1)
assert 2 + 2 == 4
print(2)
assert 1 + 1 == 3
print(3) # این خط اجرا نمیشود
خروجی:
1
2
AssertionError
۳. مثال با پیام خطای سفارشی
temp = -10
assert temp >= 0, "دما نمیتواند کمتر از صفر مطلق باشد!"
خروجی:
AssertionError: دما نمیتواند کمتر از صفر مطلق باشد!
۴. کاربردهای رایج assert
assert در سه موقعیت اصلی استفاده میشود:
- اعتبارسنجی ورودیها: بررسی صحت ورودیهای تابع
- بررسی صحت خروجیها: اطمینان از درستی نتایج
- تست نرمافزار: نوشتن تستهای واحد (Unit Tests)
۵. مثال کاربردی: اعتبارسنجی ورودی تابع
def calculate_average(numbers):
"""محاسبه میانگین اعداد"""
assert numbers, "لیست نباید خالی باشد"
assert all(isinstance(n, (int, float)) for n in numbers), "همه مقادیر باید عدد باشند"
return sum(numbers) / len(numbers)
# استفاده صحیح
print(calculate_average([10, 20, 30])) # خروجی: 20.0
# استفاده نادرست - لیست خالی
print(calculate_average([])) # AssertionError: لیست نباید خالی باشد
۶. مثال کاربردی: تست با pytest
یکی از مهمترین کاربردهای assert در تستنویسی است. کتابخانه pytest از assert برای بررسی نتایج تست استفاده میکند:
# فایل: test_calculator.py
def add(a, b):
return a + b
def divide(a, b):
return a / b
# بخش تست ها
def test_add_positive_numbers():
assert add(2, 3) == 5
def test_add_negative_numbers():
assert add(-1, -1) == -2
def test_divide():
assert divide(10, 2) == 5.0
اجرای تست:
$ pytest test_calculator.py -v
test_calculator.py::test_add_positive_numbers PASSED
test_calculator.py::test_add_negative_numbers PASSED
test_calculator.py::test_divide PASSED
مزایای استفاده از assert
| مزیت | توضیح |
|---|---|
| خوانایی بالا | کد اعتبارسنجی واضح و مختصر است |
| اشکالزدایی سریع | خطاها را زودهنگام شناسایی میکند |
| مستندسازی خودکار | فرضیات برنامه را مشخص میکند |
| تستپذیری | نوشتن تستهای واحد را آسان میکند |
۹. نکته بسیار مهم: غیرفعال شدن در Production
هشدار: دستورات assert در زمان اجرا با پرچم -O (optimized) به طور کامل نادیده گرفته میشوند و هیچ کدی اجرا نمیشود!
# فایل: example.py
def process_data(data):
assert data is not None, "داده نباید None باشد"
assert isinstance(data, list), "داده باید لیست باشد"
# پردازش داده...
return data
اجرای عادی:
$ python example.py
# assert ها بررسی میشوند
اجرا با پرچم -O:
$ python -O example.py
# تمام assert ها نادیده گرفته میشوند!
نتیجه: به همین دلیل، assert نباید برای مدیریت خطاهای برنامه استفاده شود. برای اعتبارسنجیهای مهم در محیط Production از if/raise استفاده کنید:
# ❌ نادرست - استفاده از assert برای منطق اصلی
def withdraw_money(account, amount):
assert amount > 0, "مبلغ باید مثبت باشد"
# ...
# ✅ درست - استفاده از if/raise برای اعتبارسنجی مهم
def withdraw_money(account, amount):
if amount <= 0:
raise ValueError("مبلغ باید مثبت باشد")
# ...
خلاصه: چه زمانی از assert استفاده کنیم؟
| استفاده کنید ✅ | استفاده نکنید ❌ |
|---|---|
| تست و دیباگ | مدیریت خطاهای برنامه |
| اعتبارسنجی ورودی در توسعه | اعتبارسنجی ورودی کاربر |
| بررسی فرضیات داخلی | جایگزین try/except |
| نوشتن Unit Test | شرطهایی که باید همیشه بررسی شوند |