return ast.unparse(node).strip() AttributeError: module 'ast' has no attribute 'unparse'
时间: 2023-08-06 09:08:11 浏览: 230
很抱歉,我之前的回答中使用了 `ast.unparse()`,但实际上在 Python 3.9 之前的版本中没有该方法。以下是一个修正后的代码示例,可以获取函数调用栈中的函数体和类方法体,并将它们以字符串形式返回:
```python
import ast
import os
import inspect
class FunctionVisitor(ast.NodeVisitor):
def __init__(self, target_file, target_line, target_function):
self.target_file = target_file
self.target_line = target_line
self.target_function = target_function
self.function_calls = {}
def visit_FunctionDef(self, node):
current_file = os.path.basename(self.target_file)
if node.name == self.target_function and current_file == self.target_file:
self.function_calls[(node.name, node.lineno)] = inspect.getsource(node)
def visit_Call(self, node):
if isinstance(node.func, ast.Attribute):
attribute_name = node.func.attr
attribute_value = node.func.value
if isinstance(attribute_value, ast.Name):
attribute_file = self.target_file
attribute_line = node.lineno
self.function_calls[(attribute_name, attribute_line)] = inspect.getsource(node)
self.generic_visit(node)
def analyze_function_calls(directory, target_file, target_line, target_function):
module_files = get_module_files(directory)
function_calls = {}
for file in module_files:
with open(file, 'r', encoding='utf-8') as f:
tree = ast.parse(f.read())
function_visitor = FunctionVisitor(target_file, target_line, target_function)
function_visitor.visit(tree)
function_calls.update(function_visitor.function_calls)
return function_calls
def get_module_files(directory):
module_files = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.py'):
module_files.append(os.path.join(root, file))
return module_files
directory = 'your_directory' # 修改为你要分析的目录
target_file = 'your_file.py' # 修改为函数所在的文件名
target_line = 10 # 修改为函数所在的行号
target_function = 'your_function' # 修改为你要分析的函数名
function_calls = analyze_function_calls(directory, target_file, target_line, target_function)
for (name, line), source_code in function_calls.items():
print(f"Function or Attribute: {name}")
print(f"Line: {line}")
print(f"Source Code:\n{source_code}\n")
```
在修正后的代码中,我们使用了 `inspect.getsource()` 方法来获取函数体和类方法体的源代码,并将它们存储在字典 `function_calls` 中。字典的键是一个元组,包含函数或属性的名称和行号。
请将代码中的 `your_directory`、`your_file.py`、`target_line` 和 `your_function` 分别替换为你要分析的目录、函数所在的文件名、函数所在的行号和函数名。运行代码后,它会返回一个字典,其中包含函数和属性调用信息及其对应的源代码,并打印出这些信息。
这只是一个简单的示例代码,可能无法处理特殊情况或复杂的代码结构。在实际使用时,请根据你的具体需求进行修改和扩展,并且仍然建议仔细测试和验证结果。
阅读全文