我正在使用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)"
这将在最近进行排序,但我只想要定义的函数及其行,或者默认情况下,在行中进行管理。
答案 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()']