【发布时间】:2012-05-16 15:44:55
【问题描述】:
我正在编写以下函数来格式化文件对象“项目”中的一些文本:
def clean(item):
lines = open(str(item)).readlines()
outp = []
switch = 1
for line in lines:
line = line.strip()
if line:
line = re.sub(' +', ' ', line)
if '%' in line:
line = line.replace('%', ' per cent')
if line.startswith('Note'):
switch = 2
if line.startswith('l\t'):
line = line.split('\t')
line[0] = '<@01_bullet_point>l<@$p>'
line = '\t'.join(line)
outp.append(get_prefix(switch,1) + line)
else:
outp.append(get_prefix(switch,2) + line)
outp.append('\n')
return ''.join(outp)
我收到一个 TypeError: unsupported operand types for +: 'NoneType' and 'str'
我在谷歌上搜索了解决方案,但找到了http://www.skymind.com/~ocrow/python_string/,其解决方案 4 似乎证实了我在正确的轨道上。
此引用的其他函数已确认有效,因此我知道问题一定出在此处,但是在尝试查找相关的 SO 问题并简而言之检查了我的 Python 副本后,我不知道为什么我得到了错误。我最好的猜测是与变量范围有关,但我看不到它,而且,再次搜索,我无法理解为同样的问题。我希望我遗漏了一些明显的东西,但我们将不胜感激。
编辑 get_prefix 是:
def get_prefix(section, type):
if section == 1:
if type == 1:
prefix = '@01_bullets:'
elif type == 2:
prefix = '@04_section_sub_subhead:'
else:
prefix = '@06_body_text:'
else:
if type == 2:
prefix = '@14_notes_sub_sub_heading:'
else:
prefix = '@16_notes_text:'
return prefix
我看不出它如何返回 None。
完整的回溯是:
File "rep_builder.py", line 65, in <module>
`rep.write(clean(item))`
File "rep_builder.py", line 36, in clean
`outp.append(get_prefix(switch,2) + line)`
TypeError: unsupported operand types for +: 'NoneType' and 'str'
抱歉更新缓慢,我在两台无法连接的机器上工作(长话短说)。
【问题讨论】:
-
您对
get_prefix的调用是否有可能返回None? -
在这些情况下,最好发布完整的回溯,因为这通常可以查明导致问题的行,并且更容易找出原因。
-
提示:启动
ipython会话(如果没有,请安装它)并以这种方式尝试您的代码。如果发生异常,您可以在下一个命令中输入“debug”,它会将您放入调试器的适当位置。 -
@kwatford 感谢您的提示。我回家后需要尝试一下,因为我正在使用的机器被锁定,所以我无法在它们上安装任何东西。
-
首先对原始问题的格式错误(已修复)表示抱歉,这是在我为 SO 代码块添加空格而不是原始代码中的错误时发生的。事实证明这真的很奇怪。我现在在家里检查了这段代码,它第一次完美运行。当我明天进去时,我会在我的工作机器上重新运行,试图追查到底发生了什么。感谢到目前为止的建议。
标签: python