تقنية

contextmanager في بايثون: هل يصلح الكائن نفسه لدخول ثانٍ؟

contextmanager; own=managed(own_events); first:"bud"; second:AttributeError; own_events:["enter","exit"]
إعادة.

الكائن الناتج من contextmanager للاستعمال مرة؛ تزيين الدالة ينشئ مولدًا جديدًا لكل استدعاء. [1] [2]

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

لا؛ نميز الكائن عن التزيين. [1] [2]

  • الكائن الناتج من contextmanager للاستعمال مرة؛ تزيين الدالة ينشئ مولدًا جديدًا لكل استدعاء. [1] [2]
  • في CPython 3.12.14، دالة managed تستخدم yield واحدة "bud" وتسجل "enter" ثم "exit"؛ own_events=[] وown=managed(own_events). [1] [2]
  • بعد with الأولى وخروجها العادي، with ثانية على own ترفع AttributeError قبل الكتلة؛ السجل يبقى ["enter","exit"]. [1] [2]
  • __enter__ المثبتة تحذف سمات الإنشاء؛ التزيين يعيد إنشاء المدير بدل إعادة دخول الكائن المستعمل. [1] [2]
  • تحكم: control_events=[]؛ @managed(control_events) تزين run التي تعيد "leaf"؛ استدعاؤها مرتين يسجل ["enter","exit","enter","exit"]. نوع الخطأ مقيد بالإصدار، والتجربة متزامنة دون تداخل. [1] [2]

إعادة الاستعمال

الكائن الناتج من contextmanager للاستعمال مرة؛ تزيين الدالة ينشئ مولدًا جديدًا لكل استدعاء. [1] [2]

المدير

في CPython 3.12.14، دالة managed تستخدم yield واحدة "bud" وتسجل "enter" ثم "exit"؛ own_events=[] وown=managed(own_events). [1] [2]

الدخول الثاني

بعد with الأولى وخروجها العادي، with ثانية على own ترفع AttributeError قبل الكتلة؛ السجل يبقى ["enter","exit"]. [1] [2]

from contextlib import contextmanager @contextmanager def managed(events): events.append("enter") try:yield "bud" finally:events.append("exit") own_events=[];own=managed(own_events) with own as value:print(value) try: with own:pass except AttributeError:print("AttributeError") print(own_events) [1] [2]

@managed(control_events); run():"leaf"; run():"leaf"; control_events:["enter","exit","enter","exit"]
تزيين.

التزيين

__enter__ المثبتة تحذف سمات الإنشاء؛ التزيين يعيد إنشاء المدير بدل إعادة دخول الكائن المستعمل. [1] [2]

control_events=[] @managed(control_events) def run():return "leaf" print(run(),run()) print(control_events) [1] [2]

تحكم: control_events=[]؛ @managed(control_events) تزين run التي تعيد "leaf"؛ استدعاؤها مرتين يسجل ["enter","exit","enter","exit"]. نوع الخطأ مقيد بالإصدار، والتجربة متزامنة دون تداخل. [1] [2]

المراجع

  1. Python contextmanager
  2. CPython contextmanager

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

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