局部变量变为NoneType,我不知道为什么

时间:2012-05-15 17:36:53

标签: python

我正在编写以下函数来格式化文件对象'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'

抱歉我的两台不可连接的机器(长篇故事)工作缓慢。

3 个答案:

答案 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等于Nonesection将返回1