You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:52:45