تقنية

CommandCompiler في بايثون: هل يبقى أثر __future__؟

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

حالة المترجم تمتد للاستدعاء التالي. [1] [2]

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

نعم؛ يتذكر CommandCompiler العبارة التي ترجمها بنجاح. [1] [2]

  • أنشأنا المترجم c. [1] [2]
  • ترجمنا عبارة annotations دون تنفيذ كائنها. [1] [2]
  • ترجمنا بعدها تعريف f بالمترجم نفسه. [1] [2]
  • تعليق x يصبح نصًا؛ المخرج str. [1] [2]
  • المترجم الجديد يعطي int؛ الشيفرة السابقة ثابتة. [1] [2]

المثال

from codeop import CommandCompiler
c=CommandCompiler()
c("from __future__ import annotations",
  symbol="exec")
s="def f(x: int): pass\n"
ns={}
exec(c(s,symbol="exec"),ns)
a=ns["f"].__annotations__["x"]
print(type(a).__name__)

[1] [2]

أثر الترجمة

المصدر يحفظ أعلام __future__ من كائن الشيفرة المترجم. تنفيذ تعريف الدالة لاحقًا يصنع دالة بتعليق نصي؛ لم نستدع جسمها. ليس الاحتفاظ بالأثر معتمدًا على تنفيذ عبارة المستقبل هنا. [1] [2]

المترجم الجديد يعطي كائن int لتعليق المعامل
مترجم جديد. [1] [2]

المقارنة

المترجم الجديد، دون العبارة السابقة، يعطي كائن int للتعريف نفسه؛ تحققنا بالهوية. لا يتغير كائن شيفرة ترجمناه قبل ضبط الأعلام بأثر رجعي. نفحص نصوصنا القصيرة في 3.12.14. [1] [2]

المراجع

  1. Python 3.12: CommandCompiler
  2. CPython 3.12.14: remembered compiler flags
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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

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