Python:在交互式终端中使用eval。如何获得回报价值。什么编译模式
我有这样一些代码:Python:在交互式终端中使用eval。如何获得回报价值。什么编译模式
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"
,因为我想支持任何命令,而不仅仅是单个表达式。
并与模式"exec"
,我也不会得到返回值。
那么,解决方案是什么?
上游建议:compile-flag for single-execution to return value instead of printing it
使用实例:Python的远程外壳。我已经实现了my application,以便能够随时附加它。 server socketcontrol
module和client interactive shell implementation。
回答:
相反的compile(s, COMPILE_STRING_FN, "single")
,我可以使用此功能:
def interactive_py_compile(source, filename="<interactive>"): c = compile(source, filename, "single")
# we expect this at the end:
# PRINT_EXPR
# LOAD_CONST
# RETURN_VALUE
import dis
if ord(c.co_code[-5]) != dis.opmap["PRINT_EXPR"]:
return c
assert ord(c.co_code[-4]) == dis.opmap["LOAD_CONST"]
assert ord(c.co_code[-1]) == dis.opmap["RETURN_VALUE"]
code = c.co_code[:-5]
code += chr(dis.opmap["RETURN_VALUE"])
CodeArgs = [
"argcount", "nlocals", "stacksize", "flags", "code",
"consts", "names", "varnames", "filename", "name",
"firstlineno", "lnotab", "freevars", "cellvars"]
c_dict = dict([(arg, getattr(c, "co_" + arg)) for arg in CodeArgs])
c_dict["code"] = code
import types
c = types.CodeType(*[c_dict[arg] for arg in CodeArgs])
return c
以上是 Python:在交互式终端中使用eval。如何获得回报价值。什么编译模式 的全部内容, 来源链接: utcz.com/qa/258099.html