在运行之前,如何搜索python脚本以使用类方法?

在运行之前,如何搜索python脚本以使用类方法?,python,introspection,Python,Introspection,在运行脚本之前,我希望能够扫描python脚本以了解类方法的使用情况。例如,给定以下脚本,获取类“A”的“foo”方法的所有用法以及传递给该方法的参数 class A(): def foo(self, val): return val + 1 class B(): def foo(self, val): return val - 1 a = A() b = B() a_val = a.foo(1) b_val = b.foo(1) 这是一个

在运行脚本之前,我希望能够扫描python脚本以了解类方法的使用情况。例如,给定以下脚本,获取类“A”的“foo”方法的所有用法以及传递给该方法的参数

class A():
    def foo(self, val):
        return val + 1

class B():
    def foo(self, val):
        return val - 1

a = A()
b = B()

a_val = a.foo(1)
b_val = b.foo(1)

这是一个过于简单的示例,但这里的目标是使用regex以外的东西来搜索
foo()
模式,这样就不会返回
b.foo(1)
之类的项。我看过
ast
symtable
模块,但它们似乎没有我想要的功能。我意识到这可能是一个困难/不可能的问题,因为python是一种解释性语言,但似乎其他人以前也有过这个问题,这不能通过静态代码分析来完成,因为方法的所有者是在运行时确定的。例如,我可以添加到您的示例中:

b = a
b.foo(0)
这里
b.foo(0)
实际上是类
A
foo
方法的调用。静态代码分析无法知道这一点,因为这取决于运行时

这意味着你所要求的减少到了停顿的问题。没有办法用一个有保证(甚至比偶然更准确)的正确答案来满足你的要求

这听起来像是一个错误,但唉。您可以使用模块在运行时检查类和函数:

导入检查
Foo类:
def条(自身,val):
返回值+1
def baz(自身,编号):
返回号码
函数=inspect.getmembers(Foo(),谓词=inspect.ismethod)
对于名称,函数中的函数:
sig=检查签名(功能)
print(f'函数{name}有一个参数{sig}')
产出:

Function "bar" has a params (val)
Function "baz" has a params (number)

如果您想完成的任务必须涉及许多语法和语法的情况,那么您可以研究使用诸如ANTLR或lex/yacc(?)之类的工具,顺便说一句,有大量的Python语法可用于生成您想使用的任何类型的工具。