动手实践:如何提取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.pswp.cn/web/87002.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中字符串isalpha()函数详解

在 Python 中,isalpha() 是字符串(string)类型的内置方法,用于检查字符串中的所有字符是否都是字母字符(alphabetic character)。以下是详细说明: 一、基本功能 返回值:布尔值&…

Gradio全解13——MCP详解(4)——TypeScript包命令:npm与npx

Gradio全解13——MCP详解(4)——TypeScript包命令:npm与npx 第13章 MCP详解13.4 TypeScript包命令:npm与npx13.4.1 概念区分1. npm概念与运行逻辑2. npx概念及特点 13.4.2 操作示例1. 使用npm执行包2. 使用npx执行包3. 常用npm命令…

《推客小程序全链路开发指南:从架构设计到裂变运营》

在移动互联网流量红利逐渐消退的今天,如何低成本获客成为企业营销的核心痛点。推客小程序作为一种基于社交关系的裂变营销工具,正成为企业突破增长瓶颈的利器。本文将为您全面解析推客小程序的开发定制全流程,帮助您打造专属的社交裂变营销平…

中钧科技参加中亚数字经济对话会,引领新疆企业数字化新征程!

6月27 日,乌鲁木齐成为数字经济领域的焦点,中国新疆 - 中亚国家数字经济和数字贸易企业对话会在此盛大举行。 来自中亚国家及新疆数字经济领域的100 余位核心代表齐聚一堂,围绕数字经济时代的机遇、挑战与策略展开深度探讨。 本次对话会由新…

k8s一键部署tongweb企业版7049m6(by why+lqw)

声明 1.此贴仅供参考,请根据自身需求在测试环境测试和修改。 安装准备 1.获取对应的安装包和授权,并将授权和安装包放在同一个目录下 2.docekr已配置远程仓库 3.提前拉取jdk的镜像(这里配置了使用openjdk:8) 安装 将以下内容复制到k8s_…

Qt 与 Halcon 联合开发六:基于海康SDK设计完整的相机类【附源码】

在现代工业自动化、机器人视觉、等领域,相机模块的作用至关重要。通过相机模块采集到的图像数据,我们能够进行一系列的图像处理和分析。为了高效地控制相机和处理图像,本篇文章将介绍如何使用Qt和Halcon联合开发一个相机模块,帮助…

第7篇:Gin模板引擎——服务端页面渲染

作者:GO兔 博客:https://luckxgo.cn 分享大家都看得懂的博客 引言 在Web开发中,服务端页面渲染(SSR)依然是构建动态网页的重要方式。Gin框架虽然以API开发见长,但也内置了强大的模板引擎支持,基于Go标准库的html/template包实现。本文将深入…

RagFlow 源码部署启动指南

一、环境准备 1. 安装 uv 和 pre-commit 如果已安装,可跳过。推荐使用官方方式安装,避免报错: pipx install uv pre-commit export UV_INDEXhttps://mirrors.aliyun.com/pypi/simple安装报错 使用清华源安装: pipx install uv…

【Python基础】12 闲谈分享:Python用于无人驾驶的未来

引言:一个程序员的自动驾驶梦想 还记得2016年的那个秋天,我第一次坐进特斯拉Model S的驾驶座,体验Autopilot功能。当方向盘开始自己转动,车辆在高速公路上自动跟随前车时,我的内心涌起了一种奇妙的感觉——这不就是我…

为什么js是单线程?

js单线程,同一时间只能做一件事 。js的单线程 主要与它的用途有关。作为浏览器脚本语言,js的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。如果js同时有两个线程,一个线程在…

DVWA靶场通关笔记-文件包含(Medium级别 9种渗透方法)

目录 一、文件包含 1、原因 2、危害 3、防范措施 二、代码审计(Medium级别) 1、渗透准备 (1)配置php.ini (2)file1.php (3)file2.php (4)file3.php…

飞云翻倍布林(翻倍密码系统四线布林版)双安全系统+均价趋势指标+日线周线MACD,组合操盘技术图文分享

如上图组合操盘套装指标,主图指标-翻倍密码系统四线布林版-飞云翻倍布林。副图指标1-均价趋势指标,跟踪市场均价走势和趋势;副图指标2-日线周线MACD指标,跟踪日线和周线两个级别的MACD多空走势以及共振与否。 主图指标-飞云翻倍布…

《汇编语言:基于X86处理器》第6章 条件处理(1)

本章向程序员的汇编语言工具箱中引入一个重要的内容,使得编写出来的程序具备作决策的功能。几乎所有的程序都需要这种能力。首先,介绍布尔操作,由于能影响CPU状态标志,它们是所有条件指令的核心。然后,说明怎样使用演绎…

【分治思想】归并排序 与 逆序对

归并排序 归并排序是一种分治算法,怎么分,怎么治? 分:通过递归不断把数组分成两半,直到每个子数组只剩 1 个元素(天然有序)治:把两个已经排好序的子数组合并成一个有序数组。 把问…

SQL参数化查询:防注入与计划缓存的双重优势

在数据库操作中,SQL参数化查询(Parameterized Queries)是一种非常有效的技术,它不仅可以防止SQL注入攻击,还可以提高数据库查询的效率,尤其是在与计划缓存(Query Plan Caching)结合使…

【你怕一E1】- 孰轻孰重如何断-组合问题的多种情形

摘要 本视频讲解了组合问题的多种情形,包括多选一、多选二、多选三以及分队问题的解题方法。首先介绍了从不同人数中选人的不同选择方式,如一百人中选一人有一百种选择。随后,详细讲解了有序思考方法在多选二问题中的应用,通过选队长的方式列举不同组合情况,并归纳出选择规…

nginx反向代理的bug

nginx反向代理的bug 问题呈现 当我们配置反向代理的时候查询error.log的时候我们发现以下的问题 2025/06/29 08:38:47 [error] 7#7: *2 open() “/usr/share/nginx/html/payed/notify” failed (2: No such file or directory), client: 192.168.98.1, server: localhost, r…

MyBatis 动态 SQL 与缓存机制深度解析

在Java持久层技术体系中,MyBatis凭借其灵活的SQL映射和强大的动态SQL能力,成为企业级应用开发的首选框架。本文从动态SQL核心语法、缓存实现原理、性能优化及面试高频问题四个维度,结合源码与工程实践,系统解析MyBatis的核心特性与…

Nuxt 3 中实现跨组件通信方式总结:使用 Pinia、Provide/Inject 或 Props

在开发复杂的 Web 应用时,跨组件通信是一个常见的需求。Nuxt 3 提供了多种方式来实现这一点,包括使用状态管理工具(如 Pinia)、Vue 的 provide/inject 机制以及传统的 props 传递。本文将详细介绍这三种方法,并通过一个…

Java ArrayList 扩容机制

一、ArrayList 简介 ArrayList 是 Java 集合框架中基于数组实现的可变长度列表,其核心特性是: 支持随机访问(通过索引)支持动态扩容插入/删除效率较低(非尾部操作) 二、底层数据结构 // JDK 11 transien…