当前位置: 首页 > news >正文

动手实践:如何提取Python代码中的字符串变量的值

要提取Python代码中所有变量类型为字符串的变量的值,但不执行代码(避免安全风险),可以通过静态分析代码的抽象语法树(AST)来实现。以下是完整的解决方案:

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!

往期文章推荐:

  • 20.条件概率:不确定性决策的基石
  • 19.深度解读概率与证据权重 -Probability and the Weighing of Evidence
  • 18.WOE值:风险建模中的“证据权重”量化术——从似然比理论到FICO评分卡实践
  • 17.KS值:风控模型的“风险照妖镜”
  • 16.如何量化违约风险?信用评分卡的开发全流程拆解
  • 15.CatBoost:征服类别型特征的梯度提升王者
  • 14.XGBoost:梯度提升的终极进化——统治Kaggle的算法之王
  • 13.LightGBM:极速梯度提升机——结构化数据建模的终极武器
  • 12.PAC 学习框架:机器学习的可靠性工程
  • 11.Boosting:从理论到实践——集成学习中的偏差征服者
  • 10.GBDT:梯度提升决策树——集成学习中的预测利器
  • 9.集成学习基础:Bagging 原理与应用
  • 8.随机森林详解:原理、优势与应用实践
  • 7.经济学神图:洛伦兹曲线
  • 6.双生“基尼”:跨越世纪的术语撞车与学科分野
  • 5.CART算法全解析:分类回归双修的决策树之王
  • 4.C4.5算法深度解析:决策树进化的里程碑
  • 3.决策树:化繁为简的智能决策利器
  • 2.深入解析ID3算法:信息熵驱动的决策树构建基石
  • 1.类图:软件世界的“建筑蓝图”
import astdef extract_string_variables(code):"""从Python代码中提取所有赋值为字符串的变量值(不执行代码)返回格式: [(变量名, 字符串值), ...]"""try:tree = ast.parse(code)except SyntaxError as e:return f"语法错误: {e}"results = []# 递归处理赋值目标def process_target(target, value):# 处理简单变量赋值 (x = "value")if isinstance(target, ast.Name):if isinstance(value, ast.Str):results.append((target.id, value.s))elif isinstance(value, ast.Constant) and isinstance(value.value, str):results.append((target.id, value.value))# 处理元组解包赋值 (x, y = "a", "b")elif isinstance(target, ast.Tuple):if isinstance(value, ast.Tuple) and len(target.elts) == len(value.elts):for t, v in zip(target.elts, value.elts):process_target(t, v)# 遍历AST节点for node in ast.walk(tree):# 处理赋值语句if isinstance(node, ast.Assign):for target in node.targets:process_target(target, node.value)# 处理函数参数默认值elif isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):args = node.args# 处理位置参数默认值defaults = args.defaultsnum_pos_args = len(args.args)num_defaults = len(defaults)start_index = num_pos_args - num_defaultsfor i in range(start_index, num_pos_args):arg_name = args.args[i].argdefault_val = defaults[i - start_index]if isinstance(default_val, ast.Str):results.append((arg_name, default_val.s))elif isinstance(default_val, ast.Constant) and isinstance(default_val.value, str):results.append((arg_name, default_val.value))# 处理关键字参数默认值for j, kwarg in enumerate(args.kwonlyargs):default_val = args.kw_defaults[j]if default_val and (isinstance(default_val, ast.Str) or (isinstance(default_val, ast.Constant) and isinstance(default_val.value, str)):value = default_val.s if isinstance(default_val, ast.Str) else default_val.valueresults.append((kwarg.arg, value))return results# 示例用法
if __name__ == "__main__":code = """name = "Alice"age = 30msg = "Hello, " + namex, y = "X", "Y"title = "Manager"def greet(msg="Default greeting"):local = "inside function"class MyClass:class_var = "Class value""""print(extract_string_variables(code))

输出示例:

[('name', 'Alice'),('x', 'X'),('y', 'Y'),('title', 'Manager'),('msg', 'Default greeting'),('class_var', 'Class value')
]

功能说明:

  1. 安全静态分析:使用AST解析代码,不执行任何代码,避免安全风险
  2. 识别场景
    • 简单赋值:var = "string"
    • 链式赋值:a = b = "value"
    • 元组解包:x, y = "a", "b"
    • 函数参数默认值:def func(param="default")
    • 类属性赋值:class_var = "value"
  3. 忽略内容
    • 非字符串赋值(整数、变量、表达式等)
    • 动态生成的字符串
    • 函数/方法内部的局部变量(除非是参数默认值)

注意事项:

  1. 只能识别直接赋值的字符串字面量
  2. 无法识别动态生成的字符串(如f"Hello {name}"
  3. 函数/类内部的局部变量不会被捕获(参数默认值除外)
  4. 返回结果包含变量名和对应的字符串值元组列表

此方法通过Python标准库的ast模块实现,无需额外依赖,安全可靠地提取代码中的字符串赋值信息。

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!

http://www.dtcms.com/a/264146.html

相关文章:

  • AI问答-vue3:如何选择使用reactive或ref
  • 【HarmonyOS】鸿蒙使用仓颉编程入门
  • 基于Halcon平台的常规OCR与深度OCR性能对比分析
  • 设计模式(行为型)-访问者模式
  • python训练day46 通道注意力
  • 【kernel8】spi协议,验证,模型,设备树处理,spidev,衍生协议
  • AI人工客服实战指南:基于大模型构建生产级智能对话系统
  • Hadoop、Spark、Flink 三大大数据处理框架的能力与应用场景
  • ESP32-S3开发板深度评测:AI语音识别与图像处理全面解析
  • C++ 第四阶段 STL 容器 - 第九讲:详解 std::map 与 std::unordered_map —— 关联容器的深度解析
  • Springboot整合高德地图
  • NeurIPS-2023《A Definition of Continual Reinforcement Learning》
  • 基于GD32 MCU的IAP差分升级方案
  • 迎战 AI Overviews:SEO 不被淘汰的实战策略
  • SpringBoot全局异常详解
  • Electron 应用打包与分发:从开发到交付的完整指南
  • 多容器应用与编排——AI教你学Docker
  • Java-String类静态成员方法深度解析
  • AR 地产互动沙盘:为地产沙盘带来变革​
  • OpenCV-Python Tutorial : A Candy from Official Main Page(二)
  • 设备管理的重要性:企业数字化浪潮下的核心命题
  • 企业上网行为管理:零信任安全产品的对比分析
  • Linux基本命令篇 —— grep命令
  • 防 XSS和CSRF 过滤器(Filter)
  • go语言安装达梦数据完整教程
  • JVM 中的垃圾回收算法及垃圾回收器详解
  • 【仿muduo库实现并发服务器】Connection模块
  • CentOS 8中 更新或下载时报错:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare internal
  • 02.SpringBoot常用Utils工具类详解
  • 从马赛克到色彩错乱:一次前景图像处理异常的全流程踩坑记录