حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش دیباگ و تست‌نویسی در پایتون؛ رفع خطا با تمرین

پروژه دیباگ پایتون؛ اصلاح مرز تخفیف صفر و صد درصد

پروژه دیباگ پایتون؛ تعمیر فاکتور و جلوگیری از بازگشت باگ · 0٪

درصد تخفیف این فاکتور باید داخل بازه بسته صفر تا صد باشه. صفر یعنی بدون تخفیف و صد یعنی مبلغ نهایی صفر؛ هیچ‌کدوم ورودی نامعتبر نیستن. خطای یک علامت مساوی می‌تونه همین دو حالت قانونی رو رد کنه، درحالی‌که نمونه ده درصد همچنان درست جواب بده. برای همین فقط سبزشدن تست بازتولید اولیه کافی نیست.

مثال یک قانون ظرفیت رو با خود دو مرز می‌سنجه. کد پروژه شرط نامعتبر رو با <= و >= نوشته و باید اصلاح بشه. خطای رایج حذف کامل بررسی درصد برای قبول‌شدن صفر و صده؛ اون تغییر درصد منفی و بالای صد رو هم می‌پذیره و یک باگ تازه می‌سازه. شرط درست باید فقط بیرون بازه رو رد کنه. اعتبارسنجی پیش از محاسبه انجام می‌شه، حتی اگر سبد خالی باشه؛ خالی‌بودن فهرست مجوز تخفیف نامعتبر نیست. تابع کمکی inspect_invoice استثنای ValueError رو به داده قابل مقایسه تبدیل می‌کنه و باید همان‌طور باقی بمونه.

✍️ مثال حل‌شده:

def validate_capacity(value):
    if value < 0 or value > 10:
        raise ValueError("outside range")
    return value

assert validate_capacity(0) == 0
assert validate_capacity(10) == 10

حالا نوبت توئه: discounted_total(prices, percent) را اصلاح کن: درصد 0 تا 100 شامل دو سر معتبر است و بیرون آن ValueError بدهد، حتی برای سبد خالی. [100,200] با 10=>270، با 0=>300 و با 100=>0؛ [] با 10=>0. inspect_invoice برای درصدهای -1 و 101 باید {"error":"ValueError"} و برای ورودی معتبر {"value":مبلغ} بدهد. قیمت‌ها صحیح نامنفی‌اند. مبلغ تخفیف در این پروژه همان حاصل عددی فرمول است و گردکردن مالی انجام نمی‌شود؛ مثال‌های آزمون عمداً نتیجه عددی دقیق دارند.

فعالیت شما

discounted_total(prices, percent) را اصلاح کن: درصد 0 تا 100 شامل دو سر معتبر است و بیرون آن ValueError بدهد، حتی برای سبد خالی. [100,200] با 10=>270، با 0=>300 و با 100=>0؛ [] با 10=>0. inspect_invoice برای درصدهای -1 و 101 باید {"error":"ValueError"} و برای ورودی معتبر {"value":مبلغ} بدهد. قیمت‌ها صحیح نامنفی‌اند. مبلغ تخفیف در این پروژه همان حاصل عددی فرمول است و گردکردن مالی انجام نمی‌شود؛ مثال‌های آزمون عمداً نتیجه عددی دقیق دارند.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def subtotal(prices):
    return sum(prices)

def discounted_total(prices, percent):
    if percent <= 0 or percent >= 100:
        raise ValueError("discount outside range")
    return subtotal(prices) * (1 - percent / 100)

def inspect_invoice(prices, percent):
    try:
        return {"value": discounted_total(prices, percent)}
    except ValueError:
        return {"error": "ValueError"}