تقنية

symtable في بايثون: هل المتغير الحر يحتاج تصريح nonlocal؟

متغير حر مع علم nonlocal كاذب
قراءة ضمنية. [1] [2]

قراءة اسم من الدالة المحيطة لا تحتاج تصريحًا هنا. [1] [2]

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

لا؛ المتغير الحر في دالتنا الداخلية ليس مصرحًا بـnonlocal. [1] [2]

  • تسند outer القيمة 7 إلى mark. [1] [2]
  • تقرأ inner الاسم دون إسناد محلي. [1] [2]
  • ترتيب العلمين: is_free ثم is_nonlocal؛ الناتج True False. [1] [2]
  • إضافة nonlocal mark قبل القراءة تعطي True True. [1] [2]
  • اختبرنا 3.12.14 بتحليل النص فقط، دون تشغيله. [1] [2]

المثال

import symtable as s
text='def outer():\n mark=7\n def inner():\n  return mark'
t=s.symtable(text,'OWN','exec')
v=t.get_children()[0].get_children()[0].lookup('mark')
print(v.is_free(),v.is_nonlocal())

[1] [2]

لماذا يختلف العلمان؟

المصدر هنا يفحص نطاق المتغير الحر في الأول، وبت التصريح في الثاني. نختار جدول inner داخل outer. إضافة التصريح تبقي الاسم حرًا هنا. [1] [2]

تصريح nonlocal يجعل العلمين صحيحين
مع التصريح. [1] [2]

النطاق

OWN تسمية مصدر في الذاكرة، وexec نمط التحليل. لا نستدعي الدالتين أو نستخرج قيمة المتغير. نفحص نصينا فقط. [1] [2]

المراجع

  1. Python 3.12: Symbol free/nonlocal
  2. CPython 3.12.14: symtable.py
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

للتوسع: بحث عن لغات البرمجة

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