Эта программа поможет вам с первой частью вашего вопроса, а именно , найти все функции, которые начинаются с test_
.Вы также можете расширить его, чтобы найти определения переменных по вашему выбору, но это немного сложнее.
Основная идея состоит в том, чтобы использовать пакет 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)
HTH.