Python在一个环境中拒绝text.replace()

时间:2011-03-04 15:21:52

标签: python apache replace pylons

我一直在嘲笑pylons应用程序的以下一些脏支持代码,它在python-shell,单独的python文件中运行 fine ,或者在paster中运行时。现在,我们通过mod_wsgi和apache将应用程序置于联机状态,这段代码完全停止了。首先,代码本身:

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文件),它会反映在日志记录输出中。

我目前处于亏损状态,不知道下一步该怎么做。谷歌搜索并没有真正解决问题,所以我希望你们能帮忙,并指出使用造成这种情况的根本问题。

如果遗漏任何内容,我会在其中进行编辑。

3 个答案:

答案 0 :(得分:0)

添加一些打印语句并检查Apache日志:

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

答案 1 :(得分:0)

我不知道你的问题是什么,但我发现重复replace()并不是一件好事:如果四个模式都在字符串中,那么将会有4次创建一个新字符串。< / p>

IMO,这应该更好:

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()只对字符串进行一次传递。

使用默认参数=&gt;定义参数 dic 该值在 aux()的定义中分配给 dic ,然后不再更改。在每次调用时,都没有从外层传递 dic 的参数:该值保存在函数内。

此外,函数 aux()不需要外出并搜索STYLEDEF和LINKSTYLE的值来搜索该函数。

所有这些都应该提高执行速度。

编辑: 由于' 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)(?= )')

为了取消条件线,我写了前面的解决方案,我不知道为什么,我停在那里。解决方案的兴趣在于编写正则表达式字符串,带有断言,允许编写John Machin的解决方案,但我用这些愚蠢的元组污染了它。

还有这个解决方案:

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")')

但正如John Machin注意到的那样,更清晰,更简单的解决方案是:

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(?= )')

dic 中的值仅在执行 aux()函数定义时计算。

事实上,它非常接近replace()函数的论据。

答案 2 :(得分:0)

很抱歉,但是:不提及repr()的调试说明不可信。确保您正在记录repr(text)repr(t),而非textt

在同一条数据上运行非工作环境和至少一个工作环境并编辑您的问题,以显示您使用的实际代码和实际的日志记录输出。