![](/img/trans.png)
[英]How do I find which of 2 values are closer to a given number in python?
[英]In Python, given a line number, how do I know which scope it belongs to?
假设我有一个简单的程序:
1 def foo():
2 pass
3
4 def bar():
5 pass
给定行号1
或2
,我想知道它属于 function foo
。
与 function bar
的4
或5
相同。
最简单的方法是什么? 为简单起见,我们假设“范围”是指 function 或方法。
我正在查看libCST ,因为它提供了代码 position 元数据,但它不提供从行号到其 scope 的映射。
您可以使用ast
遍历文件结构,确定每个 function 的行范围,然后找到您指定的lineno
所在的位置。
import ast
def find_definition(linenum):
functions = {}
with open('input.py') as file:
tree = ast.parse(file.read())
for item in ast.walk(tree):
if isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
start, end = compute_size(item)
functions[item.name] = (start, end)
for key, value in functions.items():
if value[0] <= linenum <= value[1]:
return key, value
def compute_size(node):
min_lineno = node.lineno
max_lineno = node.lineno
for node in ast.walk(node):
if hasattr(node, "lineno"):
min_lineno = min(min_lineno, node.lineno)
max_lineno = max(max_lineno, node.lineno)
return (min_lineno, max_lineno + 1)
function, func_range = find_definition(1)
print(function, func_range)
#foo (1, 3)
function, func_range = find_definition(4)
print(function, func_range)
#bar (4, 6)
这里有更深入的阅读。
标准库ast模块将让您以与(您当前版本的)Python 看到它的方式相同的方式解析文件。 这将为您提供一个数据结构,其中包含代码中每个节点的行号信息( lineno
和end_lineno
属性),以及您需要的列。
然后,您可以根据需要尽可能详细地通过数据结构 go,将行号映射到相应的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.