完全に内部の実装の問題になってしまうのですが、Pythonのeval
は非常識なほど長い式(非常識なほどたくさん演算子が連なっていると……というべきか)を評価できるようには実装されていないようです。それに引っかかったのでしょう。
python
1>>> eval("1*" * 10 + "1")
21
3>>> eval("1*" * 100 + "1")
41
5>>> eval("1*" * 1000 + "1")
61
7>>> eval("1*" * 10000 + "1")
8Traceback (most recent call last):
9 File "<stdin>", line 1, in <module>
10RecursionError: maximum recursion depth exceeded during compilation
PythonレイヤでRecursionError
が起きているみたいなので、sys.setrecursionlimit(10**5)
するとなぜか例外が出なくなります。ちなみにデフォルトは1000です。
python
1>>> import sys
2>>> sys.setrecursionlimit(10**5)
3>>> eval("1*" * 10000 + "1")
41
構文解析のときに再帰する要素があるのでしょう。
sys.setrecursionlimit
で乗り切るのは、あんまりおすすめしません(すごく大きくしていけば動くかもしれないけど、先にバルスになるかもしれません。そしてそもそも競プロとしてどうよという感もあり)。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/14 06:39 編集