私はexec()で実行する必要があるコードをいくつか持っていますが、どの行がZeroDivisionErrorを呼び始めているのか知りたいと思います。ここでexec()経由で実行されたZeroDivisionErrorの引数を取得するには?
例:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
>>>exec(code)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-00bada8e7a44> in <module>()
5 print(c)
6 '''
----> 7 exec(code)
<string> in <module>()
ZeroDivisionError: division by zero
これは結構ですが、それは誤り、他のタイプのために発生したとして、私は例外の引数としてc = a/b
代わりのexec(code)
を持っているしたいと思います:
code = \
'''
a = 9
b = 0
c === b
print(c)
'''
>>>exec(code)
File "<string>", line 4
c === b
^
SyntaxError: invalid syntax
この場合、SyntaxError
はエラーの原因となった行を直接指しています。
なぜこの違いがありますか? ZeroDivisionError
を正しく指示するにはどうすればよいですか?
UPDATEは
私はSchoreによって提案された「compile()
ソリューション」を試してみましたが、私の場合は期待どおりに動作しませんでした:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
z = compile(code, "", "exec")
>>>exec(z)
ZeroDivisionError Traceback (most recent call last)
<ipython-input-8-857f94e79b67> in <module>()
6 '''
7 z = compile(code, "", "exec")
----> 8 exec(z)
? in <module>()
ZeroDivisionError: division by zero
私は、 'exec'(と' eval')が[セキュリティ上のリスク](http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)になりうること、 –
はい、私はコードについてセキュリティチェックをしていますが、これまでは書かれたコードスニペットのためだけで、うまくいくはずです。 –