2017-09-12 24 views
1

私はSymPy式に解析する必要がある文字列のリストを持っています。問題は、そのうちの1人がSympifyError例外を発生させた場合、次の文字列は例外の前に同じ文字列が返された同じSymPy式を返しません。例えば同じ入力に対して異なる式を返すSympify

、以下のコード:

import traceback 

from sympy.core import sympify 
from sympy.core.evaluate import evaluate 
from sympy.core.sympify import SympifyError 

if __name__ == '__main__': 

    equations = ['Eq(sin(pi/6), x/10)', 'Eq(x, 3))', 'Eq(sin(pi/6), x/10)'] 

    for equation in equations: 

     try: 
      with evaluate(False): 
       expr = sympify(equation) 

      print(expr) 

     except SympifyError: 
      traceback.print_exc() 

出力:追加**1あります(第一及び第三の文字列が同じであるが、それらの出力が異なること

Traceback (most recent call last): 
Eq(sin(pi/6), x/10) 
    File "C:\Users\vini_\Anaconda3\lib\site-packages\sympy\core\sympify.py", line 354, in sympify 
Eq(sin(pi/6**1), x/10**1) 
    expr = parse_expr(a, local_dict=locals, transformations=transformations, evaluate=evaluate) 
    File "C:\Users\vini_\Anaconda3\lib\site-packages\sympy\parsing\sympy_parser.py", line 889, in parse_expr 
    code = stringify_expr(s, local_dict, global_dict, transformations) 
    File "C:\Users\vini_\Anaconda3\lib\site-packages\sympy\parsing\sympy_parser.py", line 791, in stringify_expr 
    for toknum, tokval, _, _, _ in generate_tokens(input_code.readline): 
    File "C:\Users\vini_\Anaconda3\lib\site-packages\sympy\parsing\sympy_tokenize.py", line 384, in generate_tokens 
    raise TokenError("EOF in multi-line statement", (lnum, 0)) 
sympy.parsing.sympy_tokenize.TokenError: ('EOF in multi-line statement', (2, 0)) 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:/Users/vini_/PycharmProjects/bugfix_simpify/main.py", line 22, in <module> 
    expr = sympify(equation) 
    File "C:\Users\vini_\Anaconda3\lib\site-packages\sympy\core\sympify.py", line 356, in sympify 
    raise SympifyError('could not parse %r' % a, exc) 
sympy.core.sympify.SympifyError: Sympify of expression 'could not parse 'Eq(x, 3))'' failed, because of exception being raised: 
TokenError: ('EOF in multi-line statement', (2, 0)) 

注秒。 1つは意図的に間違っています(アンバランス括弧)。私は元の文字列のできるだけ近くに表現が必要なのでevaluate(False)行を使用しています。

私は何が間違っていますか?出力が同じ入力文字列で同じになるように修正する方法はありますか?

環境:Python 3.6.1; SymPy 1.1.1

ありがとうございます。

答えて

0

私はtry外のコンテキストマネージャevaluateを移動すると、あなたの問題が消える - exceptの式:これは、おそらく(常にtry句でできるだけ入れて)とにかく行っているべきものですが

import traceback 

from sympy.core import sympify 
from sympy.core.evaluate import evaluate 
from sympy.core.sympify import SympifyError 

equations = ['Eq(sin(pi/6), x/10)', 'Eq(x, 3))', 'Eq(sin(pi/6), x/10)'] 

for equation in equations: 
    with evaluate(False): 
     try: 
      expr = sympify(equation) 
     except SympifyError: 
      traceback.print_exc() 
     else: 
      print(expr) 

コンテキストマネージャーevaluateが正しく閉じられていない可能性がある、この問題は発生していないはずです。

from sympy import sympify, evaluate 
from sympy.abc import x,y 

try: 
    with evaluate(False): 
     sympify(")") 
except: 
    pass 

(x+y).simplify() 

I reported this bug: はここで同様の問題を生じる(あなたを縮小した)はるかに簡単スクリプトです。

関連する問題