تقنية

atexit في بايثون: هل unregister يلغي تسجيلًا واحدًا؟

إلغاء تسجيلي f
قبل الخروج. [1] [2]

نلغي تسجيلين للدالة نفسها في برنامج مؤلف. [1] [2]

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

يلغي unregister(f) كل تسجيلات الدالة المطابقة. [1] [2]

  • سجلنا f مرتين: بالمعاملين A وB. [1] [2]
  • الإلغاء الواحد يزيل كليهما رغم اختلاف المعاملات. [1] [2]
  • دون الإلغاء: main,K,B,A بعكس ترتيب التسجيل. [1] [2]
  • الناتج main ثم K؛ تبقى دالة keep. [1] [2]
  • اختبرنا خروجًا عاديًا في 3.12.14، لا إيقافًا قسريًا. [1] [2]

المثال

import atexit
def f(x): print(x)
def keep(): print("K")
atexit.register(f,"A")
atexit.register(f,"B")
atexit.register(keep)
atexit.unregister(f)
print("main")

[1] [2]

الدالة والمعاملات

الإلغاء لا يختار تسجيل A وحده. لا يستدعي unregister دالتنا f؛ لذلك لا نرى A أو B عند خروج المثال. بقيت keep لأنها دالة مختلفة. [1] [2]

يبقى K بعد main
خروج عادي. [1] [2]

مقارنة

حذف سطر الإلغاء يعطي main ثم K ثم B ثم A؛ تُنفذ دوال الخروج بعكس ترتيب التسجيل. إعادة الإلغاء في مثالنا لا تضيف مخرجات. [1] [2]

الحدود

شغلناه في عملية منفصلة حتى انتهى البرنامج طبيعيًا. لا نختبر أخطاء دوال الخروج، أو تعديل التسجيلات داخلها، أو الإيقاف القسري، ولا نعد بتنظيف الموارد في كل حالة. [1] [2]

المراجع

  1. Python: atexit
  2. CPython3.12.14: atexitmodule.c
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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