如何为Python中exec执行字符串生成的函数添加latexify装饰器?
解决latexify装饰exec动态生成函数的源码提取错误
错误原因
latexify的@latexify.with_latex装饰器依赖从函数对象中提取源码(通过dill/inspect模块),但exec动态生成的函数没有关联的本地源码文件,导致装饰器无法提取源码,抛出OSError: could not extract source code错误。
可行解决方案
方案一:补全函数源码属性后手动应用装饰器
先动态生成普通函数,再为函数添加源码属性,最后手动调用装饰器包装函数:
import latexify # 模拟GUI输入的函数表达式 func_expression = "x^2+x+1" # 构造不带装饰器的函数定义字符串 func_def_str = f'''def dt1(x): return {func_expression}''' # 执行字符串生成普通函数 exec(func_def_str) # 给动态生成的函数添加__source__属性,提供源码内容 dt1.__source__ = func_def_str # 手动应用latexify装饰器 dt1 = latexify.with_latex(dt1) # 获取并打印LaTeX格式字符串 eq = dt1._latex print(eq)
方案二:直接通过AST转换生成LaTeX
绕过函数对象的源码提取步骤,直接构造函数的抽象语法树(AST),使用latexify的核心转换器生成LaTeX:
import latexify import ast # 模拟GUI输入的函数表达式 func_expression = "x^2+x+1" # 解析函数定义为AST节点 ast_tree = ast.parse(f"def dt1(x): return {func_expression}") func_def_node = ast_tree.body[0] # 使用latexify默认配置创建转换器 config = latexify.get_default_config() converter = latexify.core.Converter(config) # 转换AST为LaTeX字符串 latex_str = converter.convert(func_def_node) print(latex_str)
说明
- 方案一兼容性好,无需了解latexify内部实现,适合大多数场景;
- 方案二更底层,跳过了源码提取环节,避免了依赖函数对象的源码属性,适合对灵活性要求高的场景。
内容的提问来源于stack exchange,提问作者vimmiv
相关产品推荐
相关产品推荐

