使用compile()编译含函数的表达式遇语法错误,求解决方案
问题解决方法
错误原因
compile函数第三个参数传"eval"时,仅支持编译单个表达式,而def something(): ...是定义函数的语句,不属于表达式范畴,因此会触发语法错误。eval()本身也只能执行表达式,无法处理语句,所以包裹compile()也无效。
解决方案
方法1:使用compile的"exec"模式结合命名空间
exec模式支持编译并执行语句,我们可以通过自定义命名空间来获取函数调用的结果:
expr=""" def something(): return False # 将函数调用结果赋值给变量 result = something() """ # 创建空命名空间,用于存储执行过程中的变量 namespace = {} # 编译并执行代码 exec(compile(expr, "", "exec"), namespace) # 从命名空间中取出结果 somevar = namespace['result'] print(somevar) # 输出: False
方法2:用lambda表达式适配eval(适合简单函数)
如果函数逻辑简单,可以将其改写为lambda表达式(属于表达式),直接用eval执行:
expr = "(lambda: False)()" somevar = eval(expr) print(somevar) # 输出: False
关于第三方库
不需要额外第三方库,Python标准库的compile、exec、eval就可以满足需求。
内容的提问来源于stack exchange,提问作者PythonSmellsLikeCheese
相关产品推荐
相关产品推荐

