سؤال

كيف يمكنني (بسهولة) أخذ سلسلة مثل "sin(x)*x^2" والتي قد يتم إدخالها بواسطة مستخدم في وقت التشغيل وإنتاج وظيفة بيثون التي يمكن تقييمها لأي قيمة x?

هل كانت مفيدة؟

المحلول

يمكن لمترجم Python الداخلي الخاص تحليل هذا، إذا كنت تستخدم تدوين بيثون.

إذا قمت بتغيير التدوير قليلا، فسوف تكون أكثر سعادة.

import compiler
eq= "sin(x)*x**2"
ast= compiler.parse( eq )

تحصل على شجرة بناء الجملة مجردة يمكنك العمل معها.

نصائح أخرى

يمكنك استخدام بيثون parser:

import parser
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()

from math import sin
x = 10
print eval(code)

أنها تؤدي أفضل من نقية eval وبالطبع، يتجنب حقن الكود!

 f = parser.parse('sin(x)*x^2').to_pyfunc()

أين parser يمكن تعريفها باستخدام رقائق، والنباتات، والأمتعة المدمجة، المحلل، AST.

لا تستخدم eval على إدخال المستخدم.

قد تفعل pyparing ما تريد (http://pyparsing.wikispaces.com/) خاصة إذا كانت السلاسل من مصدر غير موثوق به.

أنظر أيضا http://pyparsing.wikispaces.com/file/view/fourfn.py. لحاسبة كاملة مميزة إلى حد ما بنيت معها.

للتأكيد على نصيحة JF Sebastian، يمكن أن تكون حلول "EVER" وحتى حلول "مترجم" مفتوحة للثقوب الأمنية الدقيقة. كيف جديرة بالثقة هي المدخلات؟ مع "مترجم"، يمكنك تصفية أشياء على الأقل مثل عمليات البحث GetAttr من AST، لكنني وجدت أنه من الأسهل استخدام رقائق أو نباغ لهذا النوع من الشيء مما هو عليه تأمين نتيجة ترك Python المساعدة.

أيضا، "مترجم" خرقاء وصعب الاستخدام. انها مهملة وإزالتها في 3.0. يجب عليك استخدام وحدة "AST" (تمت إضافتها في 2.6، متوفرة في 2.5 ك "_ast").

بالاتفاق مع Vartec. أود استخدام Sympy - على وجه الخصوص، يجب أن تفعل وظيفة Lambdify بالضبط ما تريد.

يرى: http://showmedo.com/videotutorials/video؟name=7200080&fromseriesid=720.

للحصول على تفسير لطيف للغاية لهذا.

أطيب التمنيات،

المريمية يهدف إلى استبدال ماتلاب وفي مقدمة الفيديو لقد أظهرت كم هو مشابه لحالاتك التي يتم التعامل معها. يبدو أنهم يدعمون مجموعة واسعة من الأساليب. نظرا لأن الرمز مفتوح المصدر، فيمكنك استعراض ونرى بنفسك كيف يتعامل المؤلفون في مثل هذه الحالات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top