تقنية

wraps في بايثون: هل تجعل الغلاف ينفذ الدالة الأصلية؟

wrapper(): النتيجة leaf، وسجل الأصل فارغ.
جسم الغلاف.

wraps تُحدّث معلومات الغلاف وتضيف __wrapped__؛ لا تضيف استدعاء الأصل إلى جسم غلافنا. [1]

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

لا؛ غلافنا يعيد leaf دون تشغيل الأصل. [1]

  • wraps تُحدّث معلومات الغلاف وتضيف __wrapped__؛ لا تضيف استدعاء الأصل إلى جسم غلافنا. [1]
  • على CPython 3.12.14، original تعيد bud وتسجل استدعاءها؛ wrapper تعيد leaf. [1]
  • اسم wrapper يصبح original؛ wrapper.__wrapped__ is original تعطي True: الرابط يشير إلى الأصل. [1]
  • wrapper() تعيد leaf والسجل []؛ تغير الاسم لم يغير نتيجة الجسم. [1]
  • تحكم باستدعاء wrapper.__wrapped__(): تعيد bud والسجل ["original"]؛ تشغيل الأصل هنا جاء من الاستدعاء الصريح. [1]

معلومات الغلاف

wraps تُحدّث معلومات الغلاف وتضيف __wrapped__؛ لا تضيف استدعاء الأصل إلى جسم غلافنا. [1]

جسمان مختلفان

على CPython 3.12.14، original تعيد bud وتسجل استدعاءها؛ wrapper تعيد leaf. [1]

الاسم والرابط

اسم wrapper يصبح original؛ wrapper.__wrapped__ is original تعطي True: الرابط يشير إلى الأصل. [1]

from functools import wraps calls=[] def original(): calls.append("original") return "bud" @wraps(original) def wrapper():return "leaf" print(wrapper.__name__,wrapper.__wrapped__ is original) [1]

__wrapped__(): النتيجة bud، واستدعاء واحد للأصل.
استدعاء الأصل.

الاستدعاء والتحكم

wrapper() تعيد leaf والسجل []؛ تغير الاسم لم يغير نتيجة الجسم. [1]

print(wrapper(),calls) print(wrapper.__wrapped__(),calls) [1]

تحكم باستدعاء wrapper.__wrapped__(): تعيد bud والسجل ["original"]؛ تشغيل الأصل هنا جاء من الاستدعاء الصريح. [1]

المراجع

  1. Python wraps/update_wrapper

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

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