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

回到顶部