我正在编写以下函数来格式化文件对象'item'中的一些文本:
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:+不支持的操作数类型:'NoneType'和'str'
我搜索了解决方案,但找到了http://www.skymind.com/~ocrow/python_string/,他的解决方案4似乎证实我在正确的轨道上。
这个引用的其他函数已经确认正在工作,所以我知道问题必须在这里,但是,试图找到相关的SO问题并在Nutshell中检查我的Python副本,我无法弄清楚为什么我收到了错误。我最好的猜测是与变量范围有关,但我看不到它,再次,搜索出现了我无法理解的同样问题。我希望我遗漏了一些显而易见的东西,但是我会非常感激任何帮助。
EDIT 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
我看不出它会如何返回无。
完整的追溯是:
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'
抱歉我的两台不可连接的机器(长篇故事)工作缓慢。
答案 0 :(得分:4)
唯一+
操作是outp.append(get_prefix(switch,1) + line)
,类似outp.append(get_prefix(switch,2) + line)
- 这意味着get_prefix()
是罪魁祸首,此处返回None
。
答案 1 :(得分:0)
我相信您对get_prefix
的致电会导致None
被退回。
鉴于错误消息和可用的源代码,这将是最可能的原因,因为它是您尝试使用+
运算符连接未知事物和字符串的唯一地方。即,
outp.append(get_prefix(switch,1) + line)
或
outp.append(get_prefix(switch,2) + line)
编辑:检查get_prefix
函数的一种方法是在函数开头为您的prefix
变量提供一个默认字符串值,看看是否可以解决问题。这将指向该功能,但我必须同意,我不知道该代码如何返回None
,如现在所示。
答案 2 :(得分:0)
检查缩进。你确定get_prefix
看起来不像这样吗? (我问,因为clean
中的缩进是错误的):
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
如上所述缩进,如果get_prefix
等于None
,section
将返回1
。