2011-03-04 2 views
3

Я издевался над следующим кусочком грязного кода поддержки для приложения pylons, который работает fine в оболочке python, отдельном файле python или при работе в пастере. Теперь мы разместили приложение в режиме онлайн через mod_wsgi и apache, и этот конкретный фрагмент кода полностью прекратил работу. Во-первых, сам код:Python отказывается от text.replace() в одной среде

def fixStyle(self, text): 
    t = text.replace('<p>', '<p style="%s">' % (STYLEDEF,)) 
    t = t.replace('class="wide"', 'style="width: 125px; %s"' % (STYLEDEF,)) 
    t = t.replace('<td>', '<td style="%s">' % (STYLEDEF,)) 
    t = t.replace('<a ', '<a style="%s" ' % (LINKSTYLE,)) 
    return t 

Это кажется довольно простым, и, честно говоря, это так. Так что же происходит, когда я положил кусок текста в нем, например:

<table><tr><td>Test!</td></tr></table> 

Вывод должен быть:

<table><tr><td style="stuff-from-styledef">Test!</td></tr></table> 

и это, в большинстве систем. Когда мы помещаем его через приложение на Apache/mod_wsgi, хотя, происходит следующее:

<table><tr><td>Test!</td></tr></table> 

Вы угадали.

Я поставил запись в начале вывода текста, а в конце вывод исходного текста и переменной t. Он отображает то, что я здесь представляю: в большинстве систем t изменено, в среде apache это не так.

Конечно, я обязательно перезапустил apache (чтобы загрузить его .py-файлы) после каждого изменения, и он отразился на выходе журнала.

Я сейчас в растерянности и понятия не имею, куда идти дальше. Googling на самом деле не работает, поэтому я надеюсь, что вы, ребята, поможете и, возможно, укажете на фундаментальную проблему с использованием чего бы то ни было.

Если что-то не хватает, я буду править его в

+1

Ну ... Вы уверены, что apache использует правильную версию файла? –

+1

Интересно, можете ли вы показать текстовое значение с помощью отладки (текста) в начале функции и отладки (t) в конце функции. Я подозреваю, что проблема здесь отсутствует –

+0

Я добавил значения текста и t для ведения журнала (log.info ([текст, t, текст == t])) и ничего не изменилось. –

ответ

0

Добавьте некоторые печати statments и проверить журналы Apache:.

def fixStyle(self, text): 
    print "text:", text 
    print "STYLEDEF", STYLEDEF 
    t = text.replace('<p>', '<p style="%s">' % (STYLEDEF,)) 
    print "t:", t 
+0

Как отмечено в комментариях, а теперь и в исходном посте, я, конечно, добавил журнал, чтобы проверить, что происходит. Но я удалил его ради краткости. –

0

Я понятия не имею относительно того, что это ваша проблема, но я считаю, повторение replace() не очень хорошо: если четыре паттерна находятся в строке, будет создано 4 раза новая строка.

ИМО, это должно быть лучше:

def fixStyle(self, text): 
    t = text.replace('<p>', '<p style="%s">' % (STYLEDEF,)) 
    t = t.replace('class="wide"', 'style="width: 125px; %s"' % (STYLEDEF,)) 
    t = t.replace('<td>', '<td style="%s">' % STYLEDEF) 
    t = t.replace('<a ', '<a style="%s" ' % (LINKSTYLE,)) 
    return t 

import re 

STYLEDEF = 'stuff-from-styledef' 
LINKSTYLE = 'VVVV' 

def aux(m, dic = {'<p':('<p style="',STYLEDEF), 
        '<td':('<td style="',STYLEDEF), 
        'class="wide"':('style="width: 125px; ',STYLEDEF), 
        '<a':('<a style="',LINKSTYLE)}): 

    return '%s%s"' % dic[m.group()] 

pat = re.compile('<p(?=>)>|class="wide"|<td(?=>)|<a(?=)') 

ch = '<table><tr><td>Test!</td></tr></table><a type="brown" >' 
print ch 
print fixStyle(None, ch) 
print pat.sub(aux,ch) 

результат

<table><tr><td>Test!</td></tr></table><a type="brown" > 
<table><tr><td style="stuff-from-styledef">Test!</td></tr></table><a style="VVVV" type="brown" > 
<table><tr><td style="stuff-from-styledef">Test!</td></tr></table><a style="VVVV" type="brown" > 

Я думаю, что re.sub() делает на замену только один проход по строке.

Определение параметров DIC с аргументом по умолчанию => значение присваивается выпо при определении Окс(), а затем не меняется больше. При каждом вызове отсутствует проход до dic с внешнего уровня: значение сохраняется внутри функции.

Кроме того, функции aux() не нужно выходить и выполнять поиск значений STYLEDEF и LINKSTYLE.

Все это должно увеличить скорость выполнения.

.

EDIT: С ' style="' и STYLEDEF являются общими для нескольких результатов, которые будут возвращены, я попытался сократить их список, и я нашел

def aux(m, dic = {'<p'   :'<p style="%s"', 
        '<td'   :'<td style="%s"', 
        'class="wide"':'style="width: 125px; %s"'}): 
    if m.group(1): 
     return '<a style="%s"' % LINKSTYLE 
    else: 
     return dic[m.group()] % STYLEDEF 

pat = re.compile('<p(?=>)|class="wide"|<td(?=>)|(<a)(?=)') 

В целях снять условную линии, я написал предыдущее решение и, я не знаю, почему, я остановился там. Интерес к решению заключался в написании строки регулярного выражения с утверждениями, которые позволяют написать решение Джона Мачина, но я загрязнил его этими овальными кортежами.

Существует также такое решение:

def aux(m, STY = STYLEDEF,LIN = LINKSTYLE): 
    return ('style="width: 125px; ' if m.group(3) else m.group(1)+' style="') + \ 
      (LIN if m.group(2) else STY) + '"' 

pat = re.compile('(<p(?=>)|<td(?=>)|(<a(?=)))|(class="wide")') 

Но яснее и проще решение, как Джон Мачин заметил:

def aux(m, dic = {'<p' :'<p style="%s"' % STYLEDEF, 
        '<td':'<td style="%s"' % STYLEDEF, 
        '<a' :'<a style="%s"' % LINKSTYLE, 
        'class="wide"':'style="%s"' % ('width: 125px; '+STYLEDEF) }): 
    return dic[m.group()] 

pat = re.compile('<p(?=>)|class="wide"|<td(?=>)|<a(?=)') 

Значения в выпо рассчитаны только при исполнении функция aux().

Фактически, это очень близко к аргументам функций replace().

+0

Почему бы вам не объединить doodads в 'aux' время определения? Значения 'dic' становятся, например, ''

+0

@John Макин Ты знаешь: мой мерцающий мозг ... Ты совершенно прав. См. Мое редактирование. Кстати, разве это не _doodah_, с h? – eyquem

+0

http://www.thefreedictionary.com/doodad и http://www.thefreedictionary.com/doodah –

0

Извините, но: Описания отладки, которые не упоминают repr(), не заслуживают доверия. Убедитесь, что вы регистрируете repr(text) и repr(t), а не text и t.

Запустите нерабочую среду и по крайней мере одну рабочую среду на одной и той же части данных и отредактируйте свой вопрос, чтобы показать фактический код, который вы использовали, и фактический вывод журнала.

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