查找函数内的特定变量并将它们排序返回

2024-01-06

首先感谢您转发的帮助。 我正在使用 Python,并且尝试在 .py 文件中搜索以名称“test_”开头的所有函数以及包含的所有变量。我搜索的变量的格式如下:“var[”blabla”]”。所以这里我有一个例子:

def test_123:

    init = var["blabla1"]
    init2 = var["blabla2"]
    *somecode*

def test_456:

    init3 = var["blabla3"]
    init4 = var["blabla4"]
    *somecode*

我已经编写了一个脚本,它返回 html 文件中的所有函数和变量。但我必须把它们整理好,这样我才能更好地与他们合作。

现在是这样的:

test_123,test456
var["blabla1"],var["blabla2"],...

我想要这样的:

测试_123:

var["blabla1"]
var["blabla2"]

测试_456:

var["blabla3"]
var["blabla4"]

EDIT:我现在有这个:

def suchentpar():
    fobj = open("2.py", "r")
    search = fobj.read()
    tpar = re.findall(r'var\[\"\w+\"\]',search)
    return tpar
    fobj.close()

def suchenseq():
    fobj = open("2.py", "r")
    search = fobj.read()
    seq = re.findall(r'test\_\w+',search)
    return seq
    fobj.close()

该程序将帮助您解决问题的第一部分,即查找所有以以下开头的函数test_。您也可以扩展它以查找您选择的变量定义,但这有点复杂。

基本思想是使用ast包来解析你的Python源代码,并扫描结果中的函数定义。因此,您不会检测到误报,例如字符串或注释内的函数定义。例子:

# define strings for function test_foobar().
foobar="def test_foobar(): pass"

此输入包含两个错误匹配,如果没有,将使用正则表达式检测到very精心制作。使用ast,这比您想象的要简单得多。工作示例:

#!/usr/bin/env python

import ast
import sys

def test_foobar():
        pass

class FunctionNameFinder(ast.NodeVisitor):
        def visit_FunctionDef(self, node):
                if node.name.startswith("test_"):
                        print node.name, "on line", node.lineno

with open(sys.argv[1], 'rU') as f:
        FunctionNameFinder().visit(ast.parse("".join(f.readlines())))

该程序可以自行运行以检测第 6 行的虚拟函数!

EDIT:以下扩展将检测一些变量分配,但不是全部。只是为了指明方向。

        def visit_FunctionDef(self, node):
                if node.name.startswith("test_"):
                        print node.name, "on line", node.lineno
                self.generic_visit(node)

        def visit_Subscript(self, node):
                if isinstance(node.value, ast.Name) and \
                   isinstance(node.slice, ast.Index):
                        if isinstance(node.slice.value, ast.Str):
                                print '%s["%s"] on line %s' % (
                                        str(node.value.id),
                                        str(node.slice.value.s),
                                        node.lineno)
                        elif isinstance(node.slice.value, ast.Num):
                                print '%s[%s] on line %s' % (
                                        str(node.value.id),
                                        str(node.slice.value.n),
                                        node.lineno)

HTH.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找函数内的特定变量并将它们排序返回 的相关文章

随机推荐