Python:*不*检查创建函数签名

问题描述 投票:0回答:1

我正在开发静态代码分析器。给定定义类和方法的 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 static-analysis method-signature
1个回答
0
投票

您可以使用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)
        ...
© www.soinside.com 2019 - 2024. All rights reserved.