خانه / آموزش‌ها / آموزش دستور assert در پایتون

آموزش دستور assert در پایتون

🐍 HomeOfPython
|
📅 1404/10/22

سطح مقدماتی (Beginner Level)

دستور assert در پایتون یک ابزار قدرتمند برای دیباگ کردن (Debugging) و اطمینان از صحت وضعیت برنامه در یک نقطه مشخص است. به زبان ساده، شما با assert به پایتون می‌گویید: «من مطمئنم که این شرط در اینجا باید True باشد؛ اگر نبود، برنامه را متوقف کن و به من خبر بده.»

این دستور معمولاً در مراحل توسعه استفاده می‌شود تا برنامه‌نویس مطمئن شود که منطق کدش درست کار می‌کند.

سینتکس و نحوه استفاده

ساختار دستور assert بسیار ساده است:

  1. فرم ساده: assert condition
  2. فرم با پیام خطا: assert condition, message

اگر شرط (condition) مقدار True داشته باشد، برنامه بدون هیچ اتفاقی به خط بعدی می‌رود. اما اگر False باشد، پایتون یک خطای AssertionError برمی‌گرداند.

مثال اول: بررسی شرط ساده

در این مثال، ما فرض می‌کنیم که سن کاربر همیشه باید مثبت باشد.

Python

مثال دوم: متوقف شدن برنامه (Static)

اگر شرط برقرار نباشد، برنامه کرش (Crash) می‌کند.:

python
# Example 2: How it fails
x = -5
# خط زیر باعث ایجاد AssertionError می‌شود و برنامه متوقف می‌گردد
assert x > 0, "X must be positive"

کاربرد عملی

فرض کنید تابعی دارید که تخفیف محاسبه می‌کند. منطق برنامه شما حکم می‌کند که قیمت نهایی نباید از قیمت اولیه بیشتر باشد.

Python

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، استفاده از assert نکات ظریفی دارد. بزرگترین اشتباه برنامه‌نویسان نیمه‌حرفه‌ای این است که از assert برای اعتبارسنجی داده‌های کاربر (Data Validation) استفاده می‌کنند.

نکته حیاتی: پرچم بهینه‌سازی (optimization flag)

پایتون یک پرچم اجرایی به نام -O (حرف بزرگ O برای Optimize) دارد. اگر اسکریپت خود را با دستور python -O script.py اجرا کنید، پایتون تمام دستورات assert را نادیده می‌گیرد (انگار اصلا وجود ندارند) تا سرعت اجرا بالا برود.

بنابراین، اگر منطق امنیتی برنامه خود را روی assert بنا کرده باشید، در محیط‌های Production که ممکن است کد بهینه اجرا شود، امنیت برنامه شما به خطر می‌افتد.

تفاوت Assert و Exception معمولی

  • از if و raise برای چک کردن ورودی‌های کاربر (User Input) یا خطاهای قابل پیش‌بینی سیستم استفاده کنید (مثل قطع شدن دیتابیس).
  • از assert فقط برای چک کردن منطق داخلی برنامه (Internal Invariants) استفاده کنید؛ یعنی شرایطی که طبق منطق کدنویسی شما "باید" همیشه درست باشند و اگر نباشند یعنی باگ در کد وجود دارد.

مثال حرفه‌ای: استفاده صحیح و غلط

python
# BAD PRACTICE (Do NOT do this)
def delete_user(user_id):
    # اگر برنامه با python -O اجرا شود، این خط حذف شده و هر کسی می‌تواند کاربر را حذف کند!
    assert user_id != "admin", "Cannot delete admin"
    # delete logic...

# GOOD PRACTICE
def delete_user_secure(user_id):
    if user_id == "admin":
        raise ValueError("Cannot delete admin")
    # delete logic...

استفاده در Pytest

فریم‌ورک‌های تست مدرن مثل pytest از دستور assert استاندارد پایتون برای نوشتن تست‌کیس‌ها استفاده می‌کنند و با تکنیک "Assertion Rewriting" پیام‌های خطای بسیار دقیقی تولید می‌کنند.

Python

نکات تکمیلی

  1. پرانتز نگذارید: دستور assert یک تابع نیست. نوشتن assert(x > 0) در پایتون ۳ کار می‌کند اما اگر بنویسید assert(x > 0, "msg")، پایتون آن را به عنوان یک تاپل (True, "msg") ارزیابی می‌کند که همیشه True است و وارنینگ می‌دهد. همیشه بدون پرانتز بنویسید.
  2. هزینه اجرا: در حالت عادی (بدون -O)، بررسی شرط‌ها هزینه پردازشی اندکی دارد. برای حلقه‌های بسیار سنگین (High Performance Loops)، مراقب تعداد assertها باشید.