سطح مقدماتی (Beginner Level)
دستور assert در پایتون یک ابزار قدرتمند برای دیباگ کردن (Debugging) و اطمینان از صحت وضعیت برنامه در یک نقطه مشخص است. به زبان ساده، شما با assert به پایتون میگویید: «من مطمئنم که این شرط در اینجا باید True باشد؛ اگر نبود، برنامه را متوقف کن و به من خبر بده.»
این دستور معمولاً در مراحل توسعه استفاده میشود تا برنامهنویس مطمئن شود که منطق کدش درست کار میکند.
سینتکس و نحوه استفاده
ساختار دستور assert بسیار ساده است:
- فرم ساده:
assert condition - فرم با پیام خطا:
assert condition, message
اگر شرط (condition) مقدار True داشته باشد، برنامه بدون هیچ اتفاقی به خط بعدی میرود. اما اگر False باشد، پایتون یک خطای AssertionError برمیگرداند.
مثال اول: بررسی شرط ساده
در این مثال، ما فرض میکنیم که سن کاربر همیشه باید مثبت باشد.
مثال دوم: متوقف شدن برنامه (Static)
اگر شرط برقرار نباشد، برنامه کرش (Crash) میکند.:
# Example 2: How it fails
x = -5
# خط زیر باعث ایجاد AssertionError میشود و برنامه متوقف میگردد
assert x > 0, "X must be positive"
کاربرد عملی
فرض کنید تابعی دارید که تخفیف محاسبه میکند. منطق برنامه شما حکم میکند که قیمت نهایی نباید از قیمت اولیه بیشتر باشد.
سطح پیشرفته (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) استفاده کنید؛ یعنی شرایطی که طبق منطق کدنویسی شما "باید" همیشه درست باشند و اگر نباشند یعنی باگ در کد وجود دارد.
مثال حرفهای: استفاده صحیح و غلط
# 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" پیامهای خطای بسیار دقیقی تولید میکنند.
نکات تکمیلی
- پرانتز نگذارید: دستور
assertیک تابع نیست. نوشتنassert(x > 0)در پایتون ۳ کار میکند اما اگر بنویسیدassert(x > 0, "msg")، پایتون آن را به عنوان یک تاپل(True, "msg")ارزیابی میکند که همیشهTrueاست و وارنینگ میدهد. همیشه بدون پرانتز بنویسید. - هزینه اجرا: در حالت عادی (بدون
-O)، بررسی شرطها هزینه پردازشی اندکی دارد. برای حلقههای بسیار سنگین (High Performance Loops)، مراقب تعداد assertها باشید.