Я пишу программу, в которой пользователи должны иметь возможность использовать самоналоженные математические функции, содержащие функции от numpy и scipy, например. scipy.special.wofz().Python: Использование sympy.sympify для выполнения безопасного eval() для математических функций
Эти функции будут храниться в файлах и импортироваться в виде строк программой. Я огляделся и увидел, что eval() или exec() - это не безопасный способ сделать это. например. here.
Проблема с безопасностью будет заключаться в том, что хорошие пользователи загружают файл от злых пользователей, которые получают доступ к хорошей системе пользователей.
Я думал о делать что-то вроде этого:
#!/bin/python
from scipy.special import *
from numpy import *
import sympy
# Define variable a
vars = {"a":1}
# This is the string I get from a file
string = "wofz(a)"
parsed_string = sympy.sympify(string)
parsed_string.evalf(subs=vars)
Однако, это не работает. Он возвращается только:
wofz(a)
wofz (a) не оценивается. Это даже должно работать так?
У меня была другая идея: Итак, я подумал, что после того, как эта математическая функция прошла через sympify, она должна быть безопасной. Я мог бы просто сделать что-то вроде этого:
globals = {wofz:wofz}
eval(str(parsed_string), vars, globals)
, который отлично работает и возвращает:
(0.36787944117144233+0.60715770584139372j)
является то, что безопасно? Я знаю, что это не приятно.
Пожалуйста, помогите.
ahh, поэтому проблема заключается в том, что в 'sympy.functions' нет определения функции' wofz'. – user1322192
Вы хотели использовать 're' вместо' im' хотя, верно? Что делает флаг 'is_real'? Можно сделать что-то вроде 'return Number (re (...)) + Number (im (...)) * 1j', чтобы получить мнимые числа там. – user1322192
@ user1322192 Вы всегда можете внести свой вклад в SymPy, в любом случае это open-source. См. [Рабочий процесс разработки] (https://github.com/sympy/sympy/wiki/Development-workflow), он написан достаточно четко. – VPeric