تقنية

literal_eval في بايثون: قائمة قيم أم تعبير جمع؟

قائمة قيم مقبولة وتعبير جمع مرفوض
نتائج المثال. [1] [2]

فرّق القيمة من العملية. [1] [2]

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

literal_eval لا يحسب جمع العددين هنا. [1] [2]

  • [6,8] يعيد القائمة [6, 8]. [1] [2]
  • [6+8] يرفع ValueError؛ لا يعيد [14]. [1] [2]
  • ينجح ast.parse بوضع eval لكليهما؛ نجاح التحليل لا يضمن التحويل. [1] [2]
  • الأول يحوي قيمتين ثابتتين؛ الثاني عملية جمع داخل القائمة. [1] [2]
  • اختبرنا 3.12.14 ومدخلين صغيرين مؤلفين؛ لا نعمم على كل علامة جمع. [1] [2]

المثال

import ast as a
for s in ['[6,8]','[6+8]']:
 try:
  print(a.literal_eval(s))
 except ValueError:
  print('ValueError')

[1] [2]

المخرجات: [6, 8] ثم ValueError. [1] [2]

سبب الاختلاف

الأولى تحوي عقدتي Constant؛ الثانية عقدة BinOp للجمع، وتُرفض في التحويل هنا. [1] [2]

قيمتان ثابتتان مقابل عقدة جمع
عناصر القائمة في الشجرة. [1] [2]

هذه أسماء عناصر شجرة ast.parse(s,mode="eval")؛ عدد عناصر القائمة اثنان أو واحد، وليس حجم الناتج المرفوض. [1] [2]

النطاق

المدخلان صحيحا البنية؛ ليس كل فشل ValueError، فقد يرفع مدخل ناقص SyntaxError. [1] [2]

عدم تنفيذ شيفرة لا يمنع استهلاك الموارد؛ لا نوصي بالدالة لمدخلات غير موثوقة. [1] [2]

المراجع

  1. Python: ast.literal_eval
  2. CPython 3.12.14: ast.py
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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