我正在使用python进行静态分析。我的目标是:给定一个函数及其参数值,我可以评估每个中间变量的类型和返回类型吗?
例如:
def func(arg1, arg2):
intermediate_1 = arg1 + arg2
intermediate_2 = str(arg1) + str(arg2)
return str(intermediate_1) + intermediate_2
鉴于:arg1 = 3
和arg2 = 4
,
什么是找到的好方法:
type(intermediate_1)
type(intermediate_2)
func
返回的到目前为止,我所做的是:
str
以with open('path/to/file.py', 'r')...
的形式读取python文件ast
模块提取函数(因此我具有函数的完整字符串体)。然后使用type(eval('arg1 + arg2'))
将intermediate_1
的类型标记为int
。
虽然这可行,并且我可以遍历函数的每一行并重复相同的操作,但我希望尽可能避免使用eval
。 它似乎是无害的,因为它被我很高兴使用type()
包裹了,但是ast
做类似的事情。 ast.literal_eval('arg1 + arg2')
无法给出相同的结果。我可以使用字符串格式化技术,但是行ast.literal_eval('str(3) + str(4)')
也不解析。
那么有没有更好的方法来完成与eval
相同的工作?