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

如何更优地解析日志中自定义方法与类构造函数的调用参数?

日志函数调用字符串解析方案

问题根因说明

你之前将提取到的字符串直接转列表时报未定义错误,是因为Python会尝试查找字符串中出现的函数名对应的实际对象,你没有导入对应函数自然会报错。用exec虽然能跑,但存在极大的代码注入安全风险,且不符合规范。

最优Pythonic实现方案

推荐使用Python标准库自带的ast(抽象语法树)模块实现,仅解析语法结构,不会执行任何代码,也不需要提前导入任何函数/模块。

完整实现代码

import ast
from html import unescape

def parse_log_function_calls(raw_extracted_str: str) -> list[dict]:
    """
    解析日志中提取的函数调用列表字符串,返回函数名和对应参数
    :param raw_extracted_str: 正则提取到的原始字符串,比如 '[ somefunction(arg1=3,arg2="odd"),somefunction2(arg1=8,arg2="even")]'
    """
    # 第一步:还原HTML转义字符
    processed_str = unescape(raw_extracted_str)
    # 第二步:解析表达式语法树,mode=eval表示只解析单个表达式,不会执行代码
    expr_tree = ast.parse(processed_str, mode='eval').body
    parse_result = []

    # 遍历列表中的每个函数调用节点
    for call_node in expr_tree.elements:
        # 提取函数名
        func_name = call_node.func.id
        # 提取位置参数(如果你的日志中存在位置参数可以保留,不需要可以删除)
        positional_args = [ast.literal_eval(arg_node) for arg_node in call_node.args]
        # 提取关键字参数
        keyword_args = {}
        for kw_node in call_node.keywords:
            keyword_args[kw_node.arg] = ast.literal_eval(kw_node.value)
        
        parse_result.append({
            "function_name": func_name,
            "positional_parameters": positional_args,
            "keyword_parameters": keyword_args
        })
    return parse_result

调用示例

# 你从日志中正则提取到的原始字符串
raw_str = '[ somefunction(arg1=3,arg2="odd"),somefunction2(arg1=8,arg2="even")]'
result = parse_log_function_calls(raw_str)
print(result)

输出结果:

[
    {
        'function_name': 'somefunction',
        'positional_parameters': [],
        'keyword_parameters': {'arg1': 3, 'arg2': 'odd'}
    },
    {
        'function_name': 'somefunction2',
        'positional_parameters': [],
        'keyword_parameters': {'arg1': 8, 'arg2': 'even'}
    }
]

方案优势

  • 完全安全:ast.parse和ast.literal_eval只会解析语法结构,不会执行任何代码,规避了exec/eval存在的代码注入风险
  • 无依赖要求:使用Python标准库内置模块实现,无需安装第三方依赖
  • 无需预定义函数:仅做语法结构解析,完全不关心函数是否真实存在、是否已导入,适配你无法获取全量函数签名的场景
  • 适配性强:支持int、str、float、bool、None等所有Python原生字面量类型的参数值,哪怕参数值中包含逗号、引号等特殊字符也可正确解析

内容的提问来源于stack exchange,提问作者svamol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:57:03