次のようなコードがあります。
try:
c = compile(s, COMPILE_STRING_FN, "single")
except Exception as e:
answer = (idx, "compile-exception", (e.__class__.__name__, str(e)))
else:
try:
ret = eval(c, globals, locals)
except Exception as e:
answer = (idx, "eval-exception", (e.__class__.__name__, str(e)))
else:
if ret is not None:
try:
ret = str(ret)
except Exception as e:
ret = "<str-cast exception: %s: %s>" % (e.__class__.__name__, str(e))
answer = (idx, "return", ret)
これは期待どおりに機能しません。なぜならret
、None
値が存在する場合は代わりに出力されるからです。これは私が望んでいるものではありません - 私はそれを入れたいですret
。
それは"single"
私にとって正しいコンパイルモードではないようです。また、s = "def f(): return 42"
動作しません。
ただし、"eval"
単一の式だけでなく、任意のコマンドをサポートしたいからでもありません。
また、 mode"exec"
を使用すると、戻り値も取得できません。
それで、解決策は何でしょうか?
アップストリームの提案:出力する代わりに値を返すための単一実行のコンパイルフラグ
ユース ケース: Python リモート シェル。いつでもアプリケーションにアタッチできるように、これを実装しました。サーバーsocketcontrol
モジュールとクライアントの対話型シェルの実装。