要提取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')
]
功能說明:
- 安全靜態分析:使用AST解析代碼,不執行任何代碼,避免安全風險
- 識別場景:
- 簡單賦值:
var = "string"
- 鏈式賦值:
a = b = "value"
- 元組解包:
x, y = "a", "b"
- 函數參數默認值:
def func(param="default")
- 類屬性賦值:
class_var = "value"
- 簡單賦值:
- 忽略內容:
- 非字符串賦值(整數、變量、表達式等)
- 動態生成的字符串
- 函數/方法內部的局部變量(除非是參數默認值)
注意事項:
- 只能識別直接賦值的字符串字面量
- 無法識別動態生成的字符串(如
f"Hello {name}"
) - 函數/類內部的局部變量不會被捕獲(參數默認值除外)
- 返回結果包含變量名和對應的字符串值元組列表
此方法通過Python標準庫的ast模塊實現,無需額外依賴,安全可靠地提取代碼中的字符串賦值信息。
本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術!