تقنية

update_wrapper في بايثون: هل تنسخ __wrapped__ من الدالة الأصلية؟

update_wrapper(wrapper,wrapped); defaults; wrapped.__wrapped__=marker; marker=object(); link=wrapper.__wrapped__; link is wrapped:True; link is marker:False
رابط إلى الدالة.

القيمة النهائية لا تبقى marker؛ update_wrapper تربط الغلاف بالدالة wrapped نفسها. [1] [2]

الخلاصة السريعة

الرابط النهائي هو wrapped هنا. [1] [2]

  • القيمة النهائية لا تبقى marker؛ update_wrapper تربط الغلاف بالدالة wrapped نفسها. [1] [2]
  • في CPython 3.12.14، نضع wrapped.__wrapped__=marker وwrapped.tag="bud"؛ wrapper.tag="own"، والخيارات افتراضية. [1] [2]
  • wrapper.__wrapped__ is wrapped تعطي True، ومقارنتها بـmarker تعطي False؛ wrapper.tag تصبح bud. [1] [2]
  • التنفيذ يُحدّث __dict__ أولًا، ثم يعين __wrapped__ أخيرًا للأصل؛ wrapped.__wrapped__ تبقى marker هنا. [1] [2]
  • تحكم مستقل بلا رابط سابق: السمة المنسوخة leaf، والرابط إلى control_wrapped. marker كائن للاختبار؛ لا نستدعي الأجسام أو نفحص توقيعًا أو سلسلة روابط. [1] [2]

الرابط النهائي

القيمة النهائية لا تبقى marker؛ update_wrapper تربط الغلاف بالدالة wrapped نفسها. [1] [2]

سمة موجودة

في CPython 3.12.14، نضع wrapped.__wrapped__=marker وwrapped.tag="bud"؛ wrapper.tag="own"، والخيارات افتراضية. [1] [2]

النتيجة

wrapper.__wrapped__ is wrapped تعطي True، ومقارنتها بـmarker تعطي False؛ wrapper.tag تصبح bud. [1] [2]

from functools import update_wrapper def wrapped():pass def wrapper():pass marker=object();wrapped.__wrapped__=marker wrapped.tag="bud";wrapper.tag="own" update_wrapper(wrapper,wrapped) print(wrapper.__wrapped__ is wrapped, wrapper.__wrapped__ is marker,wrapper.tag) [1] [2]

update_wrapper(wrapper,wrapped); defaults; wrapped.tag="bud"; wrapper.tag before:own; wrapper.tag after:bud
سمة منسوخة.

الترتيب والتحكم

التنفيذ يُحدّث __dict__ أولًا، ثم يعين __wrapped__ أخيرًا للأصل؛ wrapped.__wrapped__ تبقى marker هنا. [1] [2]

print(wrapped.__wrapped__ is marker) def control_wrapped():pass def control_wrapper():pass control_wrapped.tag="leaf" update_wrapper(control_wrapper,control_wrapped) print(control_wrapper.__wrapped__ is control_wrapped, control_wrapper.tag) [1] [2]

تحكم مستقل بلا رابط سابق: السمة المنسوخة leaf، والرابط إلى control_wrapped. marker كائن للاختبار؛ لا نستدعي الأجسام أو نفحص توقيعًا أو سلسلة روابط. [1] [2]

المراجع

  1. Python update_wrapper
  2. CPython functools

للتوسع: لغات البرمجة.

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.