العربية
فتح في Telegram

منشور 🔹 Assertions in Python

23 يوليو 2024
|
| کانال توسعه‌دهندگان پایتون |
🔹 Assertions in Python 🔺 یکی از موارد کاربردی در پایتون assertionها هستند. استفاده از آنها برای اطمینان حاصل کردن از صحت اجرای برنامه و یافتن خطاها در هنگام توسعه و افزایش خوانایی کدهاست. 🔺 ساختار : assert_stmt ::= "assert" condition ["," message] ادعاها یا assertionها از دو قسمت تشکیل می‌شوند. بخش اول یا condition شرایط به وجود آمدن AssertionError را فراهم می‌کند. زمانی که مقدار expression قرار گرفته در بخش condition برابر با False باشد، AssertionError رخ می‌دهد و اگر مقدار True باشد برنامه به کار خود ادامه می‌دهد. برای مثال : assert 1 < 2 # nothing happens assert 1 > 2 # AssertionError بخش دوم یا message پیامی است که هنگام AssertionError نمایش داده می‌شود. 🔺 در ادامه به مثال زیر توجه کنید. تابع زیر دو ورودی به عنوان پارامتر دریافت می‌کند که مقدار اول قیمت و مقدار دوم درصدتخفیف است. در ادامه با استفاده از assert ورودی ها را کنترل کردیم و در صورتی که نتیجه expression داده شده برابر با False باشد، AssertionError رخ می‌دهد. در واقع با استفاده از assertion ورودی های تابع را کنترل کردیم. def calculate_discount_price(price, discount): assert price < 0 or discount < 0 or discount > 100 discount_amount = (discount / 100) * price return price - discount_amount سوالی ممکن است اینجا به وجود بیاید: چرا از if-statment و یا از یک exception برای مثال قبلی استفاده نکردیم؟ به بیان بهتر، دلیل استفاده از assertion چیه؟ هدف از ایجاد assertionها برای آگاهی برنامه‌نویس از خطاهایی که قابل انتظار نبودند/نیستند است، شرایطی ممکن است وجود داشته باشد که شما احتمال بروز خطا را در برنامه نمی‌دهید (برای مثال در کد بالا برنامه‌نویس احتمال نمی‌دهد که مقدار price کمتر یا برابر صفر باشد، پس از assertion استفاده کرده و در صورتی که مقادیر درست باشند برنامه به کار خودش ادامه می‌دهد). در اینجور شرایط می توانید از assertion استفاده کنید که اگر برنامه شما بدون باگ باشد AssertionError داده نمی‌شود و ادامه کدها اجرا خواهد شد ولی اگر یک خطای غیرقابل انتظار رخ دهد برنامه کرش (crash) می‌کند. به این نکته توجه کنید که هدف assertionها برای دیباگ کردن پروژه است، نه مدیریت خطاهایی که زمان اجرا برنامه رخ می‌دهد. assertion باعث می‌شود که شما باگ را ریشه‌یابی کنید. 🔹 مفسر پایتون‌ هر assert statement را به شکل زیر تفسیر و اجرا می‌کند: if __debug__: if not condition: raise AssertionError(message) قبل از اینکه condition بررسی شود، یک شرط اضافی نیز بررسی می‌شود. این شرط بررسی می کند که آیا مقدار __debug__ برابر با True است یا نه. (در حالت عادی این‌ مقدار برابر با True است و در حالت optimization برابر با False) 🔹 دو اشتباه رایجی که در هنگام استفاده از assert statement وجود دارد: 🔹 از assertion برای اعتبارسنجی داده (data validation) استفاده نکنید. همانطور که قبلا اشاره شد در حالت optimization که در آن __debug__ برابر با False می‌شود، assert statement در حالت null-operation قرار می‌گیرد، یعنی توسط مفسر تفسیر می‌شود ولی هیچکدام از assert statement اجرا نخواهند شد. به مثال زیر دقت کنید. def delete_product(user, id): assert user.has_perm("del_product") Product.objects.delete(pk=id) در حالت عادی کد بالا بدون مشکل اجرا خواهد شد و در صورتی که شرایط درست باشد product حذف می‌شود. ولی دو مسئله قابل بحث وجود دارند. مورد اول، هدف استفاده از assertion زمانی بود که خطایی غیرقابل انتظار رخ دهد. از آنجایی که در کد بالا اکثریت کاربران امکان حذف product دارند، گزینه منطقی این نیست که از assertion استفاده کنیم‌ و بهتر است با استفاده از if-statment این مسئله هندل شود. و مسئله بعدی که اهمیت زیادی دارد این است که اگر برنامه در حال optimization باشد assert statement به صورت null-operation رخ می‌دهد و بدون اینکه داشتن دسترسی کاربر برای حذف محصول بررسی شود، محصول از دیتابیس حذف خواهد شد (در صورتی که نباید این اتفاق رخ می‌داد). 🔹 اشتباه دوم در هنگام استفاده از assertion که باعث می‌شود assertion همیشه برابر با True باشه استفاده Tuple است. به مثال زیر دقت کنید. assert (1 > 2, "This condition is not valid") انتظار می‌رود برنامه با AssertionError روبه‌رو شود، ولی این اتفاق نمی‌افتد،. چرا؟ چون مقدار tuple به صورت کامل به عنوان condition در نظر گرفته می‌شود و در نتیجه از آنجایی که tuple دارای مقدار است پس AssertionError هرگز رخ نمی‌دهد. 🔖 #Python, #پایتون 👤 ȺʍìɾⱮօհąʍʍąժ 💎 Channel: @DevelopixPython
26 · 6.8K ·

بجوارها في الخلاصة

|| کانال توسعه‌دهندگان پایتون |• زیبایی بهتر از زشتی است مثال بارز از رعایت این اصل را در سینتکس پایتون مشاهده می‌کنیم و در زمان نوشتن کد نیز باید به آن توجه شود. با توجه به اینکه هر فرد می‌ت|| کانال توسعه‌دهندگان پایتون |• خطاها نباید نادیده گرفته شوند، مگر به صورت صریح و واضح! خطاهای برنامه نیاز است به صورت صحیح مدیریت شوند. استفاده از pass برای نادیده گرفتن آنها ممکن است به صو
هذه الرسالة
|| کانال توسعه‌دهندگان پایتون |#سوال ✨ مشکل کد و راه‌حل شما برای آن چیست ⁉️ ✍️ *ژنرال* 💎 Channel: @DevelopixPython|| کانال توسعه‌دهندگان پایتون |#سوال ✨ مقدار "iter called" چند بار print خواهد شد ⁉️ 💠 پیش‌نیاز ✍️ *ژنرال* 💎 Channel: @DevelopixPython
|| کانال توسعه‌دهندگان پایتون || کانال توسعه‌دهندگان پایتون |@DevelopixPython · قناة · التقنية
7 646مشتركون880متوسط وصول المنشور
خلاصة المجتمع فتح في Telegram

خلاصة عامة مفتوحة من فهرس البحث ChatCrawler — «Google لـ Telegram العام»؛ تُحدَّث كلما زحفنا إلى المجتمع. الأوقات بتوقيت UTC.

محتوى عام فقط، وAPI Telegram الرسمي. عن المشروع · الأسئلة الشائعة · حدود الفهرس · إزالة صفحة · الدليل · بحث · كيف نحسب