2014-01-15 2 views
5

SymPy оснащен функцией sympify(), которая может анализировать произвольные строки в выражениях SymPy. Но у него есть два основных недостатка:SymPy: Безопасные синтаксические строки

  1. Это не безопасно, так как она опирается на пресловутый Eval()
  2. Он автоматически упрощает выражение для чтения. например sympify («бином (5,3)») возвратит Выражение 10.

Так что мои вопросы:

Во-первых, есть ли способ, чтобы «просто разобрать» строку, без каких-либо дополнительных вычислений ? Я хочу, чтобы достичь чего-то вроде этого эффекта:

latex(parse('binomial(5,3)')) #returns '{\\binom{5}{3}}' 

Во-вторых, есть общепринятый способ sympify (т.е. разобрать и вычислительные) произвольные пользовательские сгенерированные строки, оставаясь при этом в безопасности? Это сделано SymPy Gamma, поэтому это возможно на практике, но вопрос в том, сколько грязной работы необходимо.

ответ

1

Посмотрите на внутренние функции модуля синтаксического анализа SymPy.

Нет официального способа сделать это. Нам нужно переписать sympify, чтобы избежать eval. Обратите внимание, что SymPy gamma просто использует sympify. Он остается безопасным, поскольку он изолирован от App Engine.

Смежные вопросы