2010-06-18 2 views
1

Я хотел бы написать программу, которая модифицировать программы питона таким образом:Могу ли я использовать модуль python ast для этого?

изменения

«некоторые символьная строка%»% КОЕ

в

FunctionCall ("некоторые символьная строка % ")% КОЕ

Спасибо,

+0

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

ответ

1

Вы можете решить эту проблему с того, чтобы написать программа. Вместо этого просто используйте лучший редактор, когда-либо созданный: Emacs. Стоит учиться, если вы еще этого не сделали. С его помощью вы можете решить эту проблему, используя функцию regex-replace. Единственная проблема заключается в том, что я редко использую регулярные выражения, поэтому я всегда забываю детали критического синтаксиса и все равно буду искать его: P Я попытаюсь снова это понять для вас. Вот ссылка на Search & Replace Info for Emacs - scroll down for using regex's

+1

Мне нужен способ сделать это мелодраматически, поэтому я могу включить его в другую программу как своего рода препроцессор. –

+0

[Мелодрама] (http://en.wikipedia.org/wiki/Melodrama), а? Но если вы хотите сделать это по коду, просто используйте python 're' для обработки регулярных выражений. – JAB

+0

Мелодраматически я набрал? F * ing проверка орфографии. Я был программным. –

2

Это может быть проще с tokenize - адаптировать пример в документации,

import cStringIO 
import tokenize 

class Lookahead(object): 

    def __init__(self, s): 
    self._t = tokenize.generate_tokens(cStringIO.StringIO(s).readline) 
    self.lookahead = next(self._t, None) 

    def __iter__(self): 
    return self 

    def next(self): 
    result = self.lookahead 
    if result is None: raise StopIteration 
    self.lookahead = next(self._t, None) 
    return result 


def doit(s): 
    toks = Lookahead(s) 
    result = [] 
    for toktype, tokvalue, _, _, _ in toks: 
    if toktype == tokenize.STRING: 
     pk = toks.lookahead 
     if pk is not None and pk[0] == tokenize.OP and pk[1] == '%': 
     result.extend([ 
      (tokenize.NAME, 'functioncall'), 
      (tokenize.OP, '('), 
      (tokenize.STRING, repr(tokvalue)), 
      (tokenize.OP, ')') 
     ]) 
     continue 
    result.append((toktype, tokvalue)) 
    return tokenize.untokenize(result) 


print doit('"some literal string %" % SOMETHING') 

Печатается functioncall ('"some literal string %"')%SOMETHING. Интервал довольно странный (требуется гораздо больше усилий, чтобы получить интервал в самый раз, но это еще хуже для восстановления источников из модифицированного AST), но это просто отлично, если все, что вы собираетесь делать, это импортировать/запустить (не так хорошо, если вы хотите получить хорошо читаемый и редактируемый код), но это довольно большая проблема, что я бы предложил отдельный Q ;-).

+0

Кажется, что нежелательные кавычки по сравнению с тем, что спрашивал OP.Я полагаю, что замена результата (tokvalue) на tokvalue дает желаемый результат. –

0

Here - еще один вопрос, который может быть полезен.

я понимаю, что ast модуля не имеет средства для возвращения к исходному коду, но Armin Ronacher написал модуль codegen который реализует to_source функции делать только, что для ast узлов.

Я не пробовал это делать сам.

+0

Модуль codegen не работает для каждого кода python :( –

0
import re 

pattern = r'(".+? %")(?= %)' 
oldstr = '"some literal string %" % SOMETHING' 

newstr = re.sub(pattern, r'functioncall(\1)', oldstr) 

Попробуйте что-нибудь подобное. (Хотя с файловыми вводами/выводами, конечно.) Я еще не работал с ast, так что я действительно не знаю, будет ли использование этого проще для чего-то подобного, но мне кажется, что если вы просто выполняйте простой поиск - замените и не выполняйте много сложного разбора, тогда нет необходимости использовать ast.

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