忽略文本python文件的多行注释

时间:2018-03-25 11:12:26

标签: python python-3.x text

我正在使用python,创建一个必须打开python文件的函数(它必须编译),并提取其中包含的所有函数的名称。

但它必须忽略每个评论行。我尝试了一切,但我无法做到。它包括线条,或进入无限循环。

我的代码现在看起来像这样:

import py_compile

def isPythonFile(is_python_file):
    try:
        py_compile.compile(is_python_file)
        return True
    except py_compile.PyCompileError:
        print(is_python_file + "does not contain syntactically correct Python code")
        return False


def get_functions(python_file, fun_data_file):
    if (isPythonFile(python_file)):
        archivo = open(python_file, "r")
        contenido = archivo.readlines()

    contFuncs = []
    isComentario = False
    i = 0

    while (i < len(contenido)):
        print(i)

        if(contenido[i].startswith("\"\"\"") or isComentario): #In this conditional I want to start ignoring multiline comments
            isComentario = True


        elif(contenido[i].startswith("#") or contenido[i].startswith("\"") or contenido[i].startswith("\'")):
            i += 1
        elif(contenido[i].startswith("def")):
            contFuncs.append(contenido[i].split("#"))
            i += 1
        else:
            i += 1

    print(contFuncs)

编辑:例如,我用于输入的测试文件是:

def funcionPrueba(self):
    pass
def alex(self):
    pass
# def comentada(self):
#   pass
"""def hola""" """Hola
asd"""


'''
Pues nosotros declaramos esta mierda como
def tomaYjodete y nos la marcamos
'''

'toma ahi'

"Y esta que"
def monxo(self): #def hacker():
    pass
def cla(self): 
    def cla2(): 
        pass
    cla2()

    pass

"""
Yieeepale casiiii
"""

def zilveztre(self):
    pass
    enter code here

它必须只输出定义的函数:

"def funcionPrueba(self),
def alex(self),
def monxo(self),
def cla(self),
def cla2(),
def zilveztre(self)"

这将在最近进行排序,但我只想要定义的函数及其行,或者默认情况下,在行中进行管理。

1 个答案:

答案 0 :(得分:0)

您的代码存在问题:

while (i < len(contenido)):
    if(contenido[i].startswith("\"\"\"") or isComentario):
        isComentario = True
    ...
    else:
        i += 1

isComentario设置为True时,此if语句将评估为true,并且您的循环不会递增i。因此,循环的下一次迭代会再次检查同一行,if再次计算为True,i不会递增,并且您有一个无限循环。

使用python源代码的正确方法是使用ast module。您使用ast.parse来解析代码,然后使用ast.walk来查找所有函数定义:

import ast

tree = ast.parse(code)
functions = []

for node in ast.walk(tree):
    if isinstance(node, ast.FunctionDef):
        args = ', '.join(arg.arg for arg in node.args.args)
        function = '{}({})'.format(node.name, args)
        functions.append(function)

print(functions)
# output:
# ['funcionPrueba(self)', 'alex(self)', 'monxo(self)',
# 'cla(self)', 'zilveztre(self)', 'cla2()']