如何列出特定 .py 文件中的所有类和方法/函数?

Tal*_*ili 2 python

假设我们有两个 python 文件(例如file_1.pyfile_2.py),其结构如下:

-- file_1.py
      # file_1.py imports file_2
      fo(x) # a function
      A  # a class
          fun(y) # some method
          _bo(y) # some "hidden" method
-- file2.py
      bar(x) # a function
Run Code Online (Sandbox Code Playgroud)

我想要一些像get_functions_and_methods('file_1.py')这样的输出的函数:

'fo(x)', 'a.fun(y)', 'a._bo(y)'
Run Code Online (Sandbox Code Playgroud)

鉴于我是 Python 新手,我不知道如何构建此类信息,并且很乐意获得帮助。

我在网上找到的最接近的是:

我应该如何解决这个问题?谢谢!

Him*_*dar 7

假设你有一个包含以下成员的 python 文件

文件1.py

def fo(x):
    pass

class A:
    def fun(self, y):
        pass 
    
    def _bo(self, y):
        pass
        
    def NS(y, z):
        pass
        
class B:
    def foo(self, z):
        pass 
    
    def _bar(self, t):
        pass
Run Code Online (Sandbox Code Playgroud)

预期输出为:

fo(x), A.fun(self, y), A._bo(self, y), A.NS(y, z), B.foo(self, z), B._bar(self, t)
Run Code Online (Sandbox Code Playgroud)

我们可以使用astpython的模块以各自的格式读取python文件及其成员。

在这里给出你的文件路径
import ast
with open(filepath) as file:
    node = ast.parse(file.read())
Run Code Online (Sandbox Code Playgroud)
获取所有函数和类
result = []
functions = [n for n in node.body if isinstance(n, ast.FunctionDef)]
classes = [n for n in node.body if isinstance(n, ast.ClassDef)]
Run Code Online (Sandbox Code Playgroud)
以所需的格式将方法添加到结果中
def show_info(functionNode):
    function_rep = ''
    function_rep = functionNode.name + '('

    for arg in functionNode.args.args:
        function_rep += arg.arg + ','

    function_rep = function_rep.rstrip(function_rep[-1])
    function_rep += ')'
    return function_rep
Run Code Online (Sandbox Code Playgroud)
将所有函数添加到结果中
for function in functions:
    result.append(show_info(function))
Run Code Online (Sandbox Code Playgroud)
将所有类方法添加到结果中
for class_ in classes:
    methods = [n for n in class_.body if isinstance(n, ast.FunctionDef)]
    for method in methods:
        result.append((class_.name + '.' + show_info(method)))
Run Code Online (Sandbox Code Playgroud)

输出 :

print(', '.join(result))
Run Code Online (Sandbox Code Playgroud)

这给了我们预期的结果

fo(x), A.fun(self,y), A._bo(self,y), A.NS(y,z), B.foo(self,z), B._bar(self,t)
Run Code Online (Sandbox Code Playgroud)

长话短说

要立即运行所有内容,只需更改下面代码中的文件路径

import ast

with open(r'YOURPYTHONFILEPATH') as file:
    node = ast.parse(file.read())

def show_info(functionNode):
    function_rep = ''
    function_rep = functionNode.name + '('

    for arg in functionNode.args.args:
        function_rep += arg.arg + ','

    function_rep = function_rep.rstrip(function_rep[-1])
    function_rep += ')'
    return function_rep

result = []
functions = [n for n in node.body if isinstance(n, ast.FunctionDef)]
classes = [n for n in node.body if isinstance(n, ast.ClassDef)]

for function in functions:
    result.append(show_info(function))

for class_ in classes:
    methods = [n for n in class_.body if isinstance(n, ast.FunctionDef)]
    for method in methods:
        result.append((class_.name + '.' + show_info(method)))

print(', '.join(result))
# This prints expected output
# fo(x), A.fun(self,y), A._bo(self,y), A.NS(y,z), B.foo(self,z), B._bar(self,t)
Run Code Online (Sandbox Code Playgroud)