假设我们有两个 python 文件(例如file_1.py和file_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 新手,我不知道如何构建此类信息,并且很乐意获得帮助。
我在网上找到的最接近的是:
__import__(从此处:使用字符串作为名称导入文件)导入 .py 文件,它似乎不起作用。问题是我不仅想捕获所有的 def,而且还想将它们连接到嵌入其中的类。我应该如何解决这个问题?谢谢!
假设你有一个包含以下成员的 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)
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |