مقدار پیشفرض تابع هنگام تعریف تابع ساخته میشه، نه در هر فراخوانی. اگر اون مقدار یک فهرست باشه و تغییرش بدیم، فراخوانیهای بعدی هم همون فهرست تغییرکرده رو میبینن. این باگ گاهی فقط وقتی ظاهر میشه که تابع دوبار در یک اجرا صدا زده بشه؛ آزمون تکفراخوانی ممکنه کاملاً موفق باشه.
مثال از 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 تغییر کند یا همان شیء نتیجه باشد. هر دو کمکی را در پاسخ نگه دار و تغییر نده.