python - 获取 eval 使用的变量
问题描述
您好,我正在尝试获取 eval 表达式使用的变量列表。我设法使用该mock
模块使某些东西起作用:
import mock
def get_eval_vars(expr):
# Use a mock dictionary to check which items are called
mock_var = mock.MagicMock()
eval(expr, {"__builtins__": {}}, mock_var)
return [args[0][0] for args in mock_var.__getitem__.call_args_list]
print(get_eval_vars("a+b+10")) # Correctly outputs [a, b]
print(get_eval_vars("a<10")) # Raises TypeError: '<' not supported between instances of 'MagicMock' and 'int'
但是,正如评论中所解释的,模拟会引发错误,因为在 MagicMock 中未定义不等式。查看模拟问题 #196似乎他们没有计划改变这一点。
是否有任何正确的方法来覆盖 MagicMock 的不等式运算符?除了使用模拟之外,还有其他选择吗?
解决方案
好吧,我自己设法做到了这一点ast
:
import ast
def get_eval_vars(expr):
st = ast.parse(expr, mode="eval")
return [node.id for node in ast.walk(st) if isinstance(node,ast.Name) and isinstance(node.ctx, ast.Load)]
print(get_eval_vars("a+b+10")) # Correctly outputs [a, b]
print(get_eval_vars("a<10")) # Correctly outputs [a]
推荐阅读
- c - 如何在 pwndbg 中为使用 -g 选项编译的可执行文件打印更多代码行?
- python-3.x - Python 代码覆盖率因导入语句而失败
- arrays - 这种阵列会是“双向阵列”吗?
- python - python,遍历数据框并检查列表中的值是否存在于该数据框的列中
- c - 如何使用正确的叉积?
- windows-10 - Windows 10、Git Bash、Julia、`Base.run` 和没有 ANSI 颜色?
- python - 如何使键盘模块检测是否进行了右键单击
- amazon-cloudwatch - 设置 Cloudwatch 事件 Cron 作业
- wordpress - Elementor 当我保存页面时,他制作了很多副本
- javascript - 如何将 javascript 连接到新创建的窗口/文档