我正在开发静态代码分析器。给定定义类和方法的 python 文件,我想为所有函数构造一个 Signature 对象。
例如,给定以下函数:
def method_with_args(self, param_a: str, param_b: int = 123) -> str:
"""
Method with arguments and a return value.
Args:
param_a (str): A string parameter.
param_b (int): An integer parameter.
Returns:
str: Concatenation of param1 and string representation of param2.
"""
return param_a + str(param_b)
我想要得到类似的东西:
<Signature (self, param_a: str, param_b: int = 123) -> str>
我知道我可以使用检查来实现此目的,但是,我不想导入分析的代码,并且这必须静态完成。
有没有直接的方法来做到这一点?
您可以使用Python的ast模块将代码视为文本并将其解析为抽象语法树:
import ast
s = '''
def method_with_args(self, param_a: str, param_b: int = 123) -> str:
"""
Method with arguments and a return value.
Args:
param_a (str): A string parameter.
param_b (int): An integer parameter.
Returns:
str: Concatenation of param1 and string representation of param2.
"""
return param_a + str(param_b)
'''
tree = ast.parse(s)
然后您可以迭代树中的节点并查找类、方法、函数或您感兴趣的任何其他内容并检查其内容以构造签名:
for node in tree.body:
if isinstance(node, ast.FunctionDef):
print([x.arg for x in node.args.args])
print([x.arg for x in node.args.kwonlyargs])
print(node.args.vararg)
print(node.args.kwarg)
...