2013-05-29 5 views
1

Мои работы относятся к инструментарию фрагментов кода в коде python. Поэтому в моей работе я бы написал скрипт в python, чтобы взять другой файл python в качестве ввода и вставить любой необходимый код в нужное место с моим скриптом.Как различать «строку» и «фактический код» в python?

Следующий код представляет собой пример кода в файл, который я бы инструментирование:

A.py #normal un-instrumented code 

statements 
.... 
.... 

def move(self,a): 
    statements 
    ...... 
    print "My function is defined" 
    ...... 

statements 
...... 

Мой сценарий, что на самом деле делает это, чтобы проверить каждый строк в A.py и если есть «DEF» затем фрагмент коды инструментальный на верхней части коды функции четкости

в следующем примере, как окончательные из пут должны быть:

A.py #instrumented code 

statements 
.... 
.... 

@decorator #<------ inserted code 
def move(self,a): 
    statements 
    ...... 
    print "My function is defined" 
    ...... 

statements 
...... 

Но я привел с различным вывод. Следующий код является конечным результатом, который я получаю:

A.py #instrumented код

statements 
.... 
.... 

@decorator #<------ inserted code 
def move(self,a): 
    statements 
    ...... 
    @decorator #<------ inserted code [this should not occur] 
    print "My function is defined" 
    ...... 

statements 
...... 

Я понимаю, что в инструментованной коде признает «DEF» в слове «определенное» и т.д. он устанавливает над ним код.

В реальности инструментальный код имеет много этих проблем, я не смог правильно измерить данный файл python. Есть ли другой способ отличить фактический «def» от строки?

Спасибо

+0

Как вы находите 'def' в приборе? Если вы используете регулярное выражение, попробуйте 'r '\ bdef \ b''. Знак '\ b' обозначает границу слова. – cdarke

+0

Будет ли работать, даже если есть такая заявка, как этот отпечаток «Это def» – Kaushik

+0

no. Чтобы иметь дело с текстом, встроенным в кавычки, вам понадобятся негативные взгляды. – cdarke

ответ

3

Используйте ast module разобрать файл должным образом.

Этот код печатает номер строки и столбца смещения каждого def заявления:

import ast 
with open('mymodule.py') as f: 
    tree = ast.parse(f.read()) 
for node in ast.walk(tree): 
    if isinstance(node, ast.FunctionDef): 
     print node.lineno, node.col_offset 
+0

Как использовать значение смещения столбца, когда я использую инструкцию над функцией def, чтобы она была правильно выровнена как функция def. – Kaushik

+1

@karthik Я не уверен, как символы вкладки влияют на 'col_offset'; попробуйте. Я думаю, вам нужно скопировать символы 'col_offset' с начала строки и использовать эту строку для отступов' @ decorator'. –

0

Вы можете использовать регулярные выражения. Чтобы избежать def внутри кавычек, то вы можете использовать отрицательные просмотровых обходные:

import re 

for line in open('A.py'): 
    m = re.search(r"(?!<[\"'])\bdef\b(?![\"'])", line) 
    if m: 
     print r'@decorator #<------ inserted code' 

    print line 

Однако могут быть другие def мест где, что вы или я не могу думать, и если мы не будем осторожны, мы в конечном-вверх пишущий парсер Python снова и снова. Предложение Джанны Карилы об использовании ast.parse, вероятно, будет более безопасным в долгосрочной перспективе.

+1

Затем есть многострочные строки. –

+0

@JanneKarila: Да, это тот, о котором я не думал. Это только показывает, что ваш ответ предпочтительнее. – cdarke

Смежные вопросы