Python 在函数中查找特定变量并将其排序返回

Python 在函数中查找特定变量并将其排序返回,python,function,sorting,variables,Python,Function,Sorting,Variables,首先,感谢您在前进中的帮助。 我使用的是Python,我试图在.py文件中搜索所有以名称“test_”开头的函数以及包含的所有变量。我搜索的变量的格式如下:“var[“blabla”]”。我举了一个例子: def测试_123: init = var["blabla1"] init2 = var["blabla2"] *somecode* def测试_456: init3 = var["blabla3"] init4 = var["blabla4"]

首先,感谢您在前进中的帮助。 我使用的是Python,我试图在.py文件中搜索所有以名称“test_”开头的函数以及包含的所有变量。我搜索的变量的格式如下:“var[“blabla”]”。我举了一个例子:

def测试_123:

    init = var["blabla1"]
    init2 = var["blabla2"]
    *somecode*
def测试_456:

    init3 = var["blabla3"]
    init4 = var["blabla4"]
    *somecode*
我已经写了一个脚本,它在一个html文件中返回我的所有函数和变量。但我必须把它们分类,这样我才能更好地与它们合作

现在是这样的:

test_123,test456
var["blabla1"],var["blabla2"],...
我希望它是这样的:

test_123,test456
var["blabla1"],var["blabla2"],...
测试单元123:

    init = var["blabla1"]
    init2 = var["blabla2"]
    *somecode*
var["blabla1"]
var["blabla2"]
测试单元456:

    init3 = var["blabla3"]
    init4 = var["blabla4"]
    *somecode*
var["blabla3"]
var["blabla4"]
编辑:我现在有这个:

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()

首先,您的代码将永远不会运行
fobj.close()

那么,获得你想要的东西的方法可以是:

import re

fcontent = '''
def test_a(self):
    var["hello"]
    var["world"]

def test_b(self):
    var["hola"]
    var["mundo"]
'''

dict_ = {}
chunks = [chunk for chunk in fcontent.split('def ') if chunk.strip()]
for chunk in chunks:
    tname = re.findall(r'test\_\w+', chunk)[0]
    vars = re.findall(r'var\[\"\w+\"\]', chunk)
    dict_[tname] = vars
for k, v in dict_.items():
    print k
    for e in v:
        print "\t%s" % e
注意:在上面的代码中,我在编写正则表达式时保留了它们,但是当然您可以对它们进行改进,如果您愿意,可以在
re.search
中更改第一个
re.findall
。换句话说:上面的内容只是一个演示来展示这个概念,但是你应该在边缘案例和效率上下功夫


在详细说明前面的答案后,您还可以使用OrderedICT(python 2.7+)来维护顺序

import re
from collections import OrderedDict

fcontent = '''
def test_a(self):
    var["hello"]
    var["world"]

def test_b(self):
    var["hola"]
    var["mundo"]
'''

dict_ = OrderedDict()
chunks = [chunk for chunk in fcontent.split('def') if chunk.strip()]
for chunk in chunks:
    print chunk
    tname = re.findall(r'test\_\w+', chunk)[0]
    vars = re.findall(r'var\[\"\w+\"\]', chunk)
    dict_[tname] = vars
print dict_

L.

此程序将帮助您完成问题的第一部分,即查找所有以
test\ucode>开头的函数。您也可以扩展它来查找您选择的变量定义,但这有点复杂

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

# define strings for function test_foobar().
foobar="def test_foobar(): pass"
此输入包含两个不正确的匹配项,如果没有非常仔细地编写,则可以使用正则表达式进行检测。使用
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行上的虚拟函数

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

        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)

这是关于python还是HTML的问题?因为据我所知,如果在执行方法/类和变量时只需按顺序打印它们的名称,它们就已经按照您要求的顺序排列了[当然,前提是方法/类彼此不调用]。这是关于Python的。使用打印对一个文件来说很容易。但我必须处理数百个文件。所以自动化是首选。显然我的问题不够清楚!;)我知道您所要求的帮助只是对一系列字符串重新排序:从
test1、test1、varA、varB
test1、varA、test2、varB
?如果不是这样的话,如果你发布了你已经拥有的代码,这将是很有帮助的,这样我们就可以查看并修改它。我已经编辑了我的问题。您可以看到返回两个列表的两个函数。这两个列表中充满了函数名和变量名。我需要的是对这两个列表进行排序,这样我就可以立即看到哪个变量属于哪个函数:)您的模式将匹配像
footest\u bar
blavar这样的内容[…
。试着用
\b
添加单词边界检查。我看你是新来的,所以我希望你不介意我说,当你的贡献是对其他用户答案的一个小改动时,你通常会将其作为注释包含在原始答案下。没有伤害也没有冒犯!:)这是一段很好的代码。由于我是python编程新手,我对它的简单性感到非常惊讶!@kory-如果这有帮助的话,请记住,如果它能永久解决问题,你可以投票选择答案,并最终选择“接受”。[也许你已经知道了这一点,但因为你是新手,我想留下一条关于它的说明!]:oTo要更新您的答案,我需要更多的声誉:)。我当前的问题是,我的代码中有如下注释:——————————————————————————————————————————————————————————————————所以我需要更正findall。