繁体   English   中英

在 Python 中,给定一个行号,我怎么知道它属于哪个 scope?

[英]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

给定行号12 ,我想知道它属于 function foo

与 function bar45相同。

最简单的方法是什么? 为简单起见,我们假设“范围”是指 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 看到它的方式相同的方式解析文件。 这将为您提供一个数据结构,其中包含代码中每个节点的行号信息( linenoend_lineno属性),以及您需要的列。

然后,您可以根据需要尽可能详细地通过数据结构 go,将行号映射到相应的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM