【问题标题】:Local variable becoming NoneType and I'm not sure why局部变量变成 NoneType 我不知道为什么
【发布时间】: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


【解决方案1】:

唯一的+ 操作是outp.append(get_prefix(switch,1) + line) 和类似的outp.append(get_prefix(switch,2) + line) - 这意味着get_prefix() 是罪魁祸首,在这里返回None

【讨论】:

  • 我建议 get_prefix 返回 None 因为其中没有 return 语句
  • @XavierCombelle - 或者只是一个return
  • 谢谢。 get_prefix 现在包含在问题中。我不认为它能够返回 None,但我很乐意得到纠正。
【解决方案2】:

检查您的缩进。你确定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

如上缩进,如果section 等于1get_prefix 将返回None

【讨论】:

  • get_prefix 与问题中出现的一样。另请参阅我对这个问题的最新评论,了解一些奇怪的更新。感谢您迄今为止的帮助。
  • 其实我是个白痴,你是对的。当我从这个脚本的前一个工作版本中拉入这个函数时,我以某种方式欺骗了缩进,然后在我为 SO 的四个空格规则重新缩进时自己修复了它。很抱歉浪费了大家的时间,感谢大家的帮助。
【解决方案3】:

我相信您对get_prefix 的调用会导致None 被退回。

鉴于错误消息和可用的源代码,这将是最可能的原因,因为这是您尝试使用 + 运算符连接未知内容和字符串的唯一地方。即,

outp.append(get_prefix(switch,1) + line)

outp.append(get_prefix(switch,2) + line)

编辑:检查get_prefix 函数的一种方法是在函数开始时为prefix 变量提供一个默认字符串值,看看是否能消除问题。那将指向该函数,尽管我必须同意,但我看不出该代码如何返回 None,如现在所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多