Описание проблемы
Существует набор из ~ 4000 файлов Python со следующей структурой:
@ScriptInfo(number=3254,
attibute=some_value,
title="crawler for my website",
some_other_key=some_value)
scenario_name = entity.get_script_by_title(title)
Цель
Цель состоит в том, чтобы получить значение заголовка от декоратора ScriptInfo (в данном случае это «сканер для моего сайта»), но есть пара проблем:
1) Нет правила именования переменной, содержащей заголовок. Вот почему это могут быть title_name, my_title и т. Д. См. Пример:
@ScriptInfo(number=3254,
attibute=some_value,
my_title="crawler for my website",
some_other_key=some_value)
scenario_name = entity.get_script_by_title(my_title)
2) У декоратора @ScriptInfo может быть более двух аргументов, поэтому получение его содержимого из скобок для получения значения второго параметра не является опцией
Мое (очень наивное) решение
Но фрагмент кода, который остается неизменным, это строка scenario_name = entity.get_script_by_title(my_title)
. Принимая это во внимание, я придумала решение:
import re
title_variable_re = r"scenario_name\s?=\s?entity\.get_script_by_title\((.*)\)"
with open("python_file.py") as file:
for line in file:
if re.match(regexp, line):
title_variable = re.match(title_variable_re, line).group(1)
title_re = title_variable + r"\s?=\s\"(.*)\"?"
with open("python_file.py") as file:
for line in file:
if re.match(title_re, line):
title_value = re.match(regexp, line).group(1)
print title_value
Этот фрагмент кода выполняет следующие действия:
1) Обходит (см. Первый with open
) файл сценария и получает переменную со значением title
, потому что программист должен выбрать его имя
2) Обходит файл сценария снова (см. Вторую with open
) и получает значение заголовка
Вопрос к семейству stackoverflow
Есть ли лучший и более эффективный способ получить значение заголовка (my_title
, title_name
и т. Д.), Чем обход файла скрипта два раза?