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

رفع آرگومان پیش‌فرض تغییرپذیر در پایتون؛ فهرست تازه در هر فراخوانی

دیباگ تابع و فهرست در پایتون · 0٪

مقدار پیش‌فرض تابع هنگام تعریف تابع ساخته می‌شه، نه در هر فراخوانی. اگر اون مقدار یک فهرست باشه و تغییرش بدیم، فراخوانی‌های بعدی هم همون فهرست تغییرکرده رو می‌بینن. این باگ گاهی فقط وقتی ظاهر می‌شه که تابع دوبار در یک اجرا صدا زده بشه؛ آزمون تک‌فراخوانی ممکنه کاملاً موفق باشه.

مثال از None به‌عنوان علامت «فهرست داده نشده» استفاده می‌کنه و بعد داخل بدنه فهرست تازه می‌سازه. توی تمرین هم باید همین استقلال رو برای ثبت برچسب فراهم کنی. خطای رایج نوشتن log=[] داخل بدنه بدون بررسی ورودی است؛ اون کار فهرستی رو که فراخواننده عمداً فرستاده کنار می‌ذاره. قرارداد اینجا دو بخش داره: در نبود فهرست، یک ظرف تازه؛ در حضور فهرست، افزودن به همان ظرف. تابع کمکی default_probe دو فراخوانی پیش‌فرض رو پشت سر هم انجام می‌ده تا اشتراک ناخواسته پنهان نمونه. این کمکی آماده رو نگه دار و فقط تابع اصلی رو تکمیل کن.

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

def remember(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

حالا نوبت توئه: add_tag(tag, log=None) باید tag را به log اضافه و همان فهرست را برگرداند؛ اگر log داده نشده یا None است، در هر فراخوانی فهرست تازه بسازد. tag رشته است و log فقط فهرست رشته‌ها یا None است. default_probe("الف","ب") باید [["الف"],["ب"]] بدهد تا استقلال دو فراخوانی مشخص شود. کمکی آماده inspect_add_tag خروجی [result,log_after,same_object] می‌دهد: هم نتیجه، هم log پس از فراخوانی و هم بولی هویت همان فهرست را می‌سنجد. inspect_add_tag("ب",["الف"]) باید [["الف","ب"],["الف","ب"],True] و inspect_add_tag("تازه",[]) باید [["تازه"],["تازه"],True] بدهد. برای log=None خروجی [[tag],None,False] است؛ قرار نیست None تغییر کند یا همان شیء نتیجه باشد. هر دو کمکی را در پاسخ نگه دار و تغییر نده.

فعالیت شما

add_tag(tag, log=None) باید tag را به log اضافه و همان فهرست را برگرداند؛ اگر log داده نشده یا None است، در هر فراخوانی فهرست تازه بسازد. tag رشته است و log فقط فهرست رشته‌ها یا None است. default_probe("الف","ب") باید [["الف"],["ب"]] بدهد تا استقلال دو فراخوانی مشخص شود. کمکی آماده inspect_add_tag خروجی [result,log_after,same_object] می‌دهد: هم نتیجه، هم log پس از فراخوانی و هم بولی هویت همان فهرست را می‌سنجد. inspect_add_tag("ب",["الف"]) باید [["الف","ب"],["الف","ب"],True] و inspect_add_tag("تازه",[]) باید [["تازه"],["تازه"],True] بدهد. برای log=None خروجی [[tag],None,False] است؛ قرار نیست None تغییر کند یا همان شیء نتیجه باشد. هر دو کمکی را در پاسخ نگه دار و تغییر نده.

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

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

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

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

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

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

def add_tag(tag, log=None):
    # در نبود log فهرست تازه بساز؛ log داده‌شده را همان‌جا تغییر بده
    pass

def default_probe(first, second):
    first_result = add_tag(first)
    second_result = add_tag(second)
    return [first_result, second_result]

def inspect_add_tag(tag, log):
    result = add_tag(tag, log)
    return [result, log, result is log]