найти все плавающие литералы в коде Python - PullRequest
1 голос
/ 04 ноября 2010

Я пытаюсь найти все вхождения буквального значения с плавающей точкой в ​​коде Python. Могу ли я сделать это в Комодо (или любым другим способом)?

Другими словами, я хочу найти каждую строку, где используется что-то вроде 0.0 или 1.5 или 1e5, предполагая, что это интерпретируется Python как литерал с плавающей точкой (например, без комментариев).

Я использую Komodo 6.0 с Python 3.1.

Если возможно, было бы неплохо найти способ поиска строковых и целочисленных литералов.

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Наша Система поиска исходного кода SD (SCSE) может легко это сделать.

SCSE - это инструмент для поиска больших баз исходного кода, намного быстрее, чем grep, путем индексации элементов интересующих языков исходного кода. Затем могут быть заданы запросы, которые используют индекс, чтобы обеспечить быстрое обнаружение результатов поиска. Запросы и совпадения отображаются в графическом интерфейсе, а щелчок по совпадению покажет блок исходного кода, содержащий совпадение.

SCSE знает лексическую структуру каждого языка, который он проиндексировал, с точностью, как компилятор этого языка. (Он использует внешние интерфейсы из семейства процессоров точного языка программирования; это семейство довольно большое и включает в себя целевой язык OP - Python / Perl / Java / ...). Таким образом, он точно знает, где находятся идентификаторы, комментарии и литералы (целые, плавающие, символьные или строковые), и точно их содержимое.

SCSE-запросы состоят из команд, представляющих последовательности интересующих языковых элементов. Запрос

'for' ... I '=' N=103

находит ключевое слово для рядом с ("...") произвольным идентификатором (I), который инициализируется ("=") с числовым значением ("N"), равным 103. Поскольку SCSE понимает языковая структура, он игнорирует языковые пробелы между токенами, например, он может найти это независимо от пробелов, пробелов, новых строк или комментариев.

Маркеры запроса I, N, F, S, C представляют I (средство для чистки), Natural (число), F (loat), S (tring) и C (omment) соответственно. Таким образом, первоначальный вопрос ОП о поиске всех чисел с плавающей точкой является почти тривиальным запросом

F

Аналогично для поиска всех строковых литералов ("S") и целых литералов ("N"). Если вы хотите найти только копии значений рядом с пи, добавьте ограничения для нижней и верхней границ:

F>3.14<3.16

(Довольно забавно запускать это на больших кодах Фортрана; вы видите все виды неправильных приближений числа Пи).

SCSE не найдет число с плавающей точкой в ​​комментарии или строке, потому что оно знает разницу. Написание выражения в стиле grep для обработки всех странных комбинаций с целью устранения пробелов или окружающих кавычек и разделительных комментариев должно быть намного более болезненным. Grep не способ сделать это.

1 голос
/ 04 ноября 2010

Вы можете сделать это, выбрав то, что вам нужно с помощью регулярных выражений.

Эта команда (запустить ее на терминале) должна выполнить свою задачу:

sed -r "s/^([^#]*)#.*$/\1/g" YOUR_FILE | grep -P "[^'\"\w]-?[1-9]\d*[.e]\d*[^'\"\w]"

Возможно, вам понадобитсянастроить его, чтобы получить лучший результат.

`sed 'исключает комментарии, в то время как grep выбирает только строки, содержащие ( небольшой подраздел - выражение, которое я дал, не является идеальным ) значениями с плавающей точкой...

Надеюсь, это поможет.

...