尝试使用用户定义的类时的Python NameError

时间:2010-04-10 21:27:50

标签: python

在尝试使用我编写的类时,我得到了一个奇怪的NameError实例。在目录中,我有以下文件结构:

  • DIR /
    • ReutersParser.py
    • test.py
    • reut-xxx.sgm

我在ReutersParser.py中定义了我的自定义类,并且我在test.py中定义了一个测试脚本。

ReutersParser看起来像这样:

from sgmllib import SGMLParser

class ReutersParser(SGMLParser):

    def __init__(self, verbose=0):
        SGMLParser.__init__(self, verbose)

    ... rest of parser

if __name__ == '__main__':

    f = open('reut2-short.sgm')
    s = f.read()

    p = ReutersParser()
    p.parse(s)

这是一个处理路透社文章的SGML文件的解析器。测试工作完美。无论如何,我将在test.py中使用它,它看起来像这样:

from ReutersParser import ReutersParser

def main():
    parser = ReutersParser()

if __name__ == '__main__':
    main()

当它到达该解析器行时,我收到此错误:

Traceback (most recent call last):
  File "D:\Projects\Reuters\test.py", line 34, in <module>
    main()
  File "D:\Projects\Reuters\test.py", line 19, in main
    parser = ReutersParser()
  File "D:\Projects\Reuters\ReutersParser.py", line 38, in __init__
    SGMLParser.__init__(self, verbose)
NameError: global name 'sgmllib' is not defined

出于某种原因,当我尝试在test.py中使用ReutersParser时,它会抛出一个错误,指出它无法找到sgmllib,这是一个内置模块。我正试着弄清楚为什么导入不起作用。

导致此NameError的原因是什么?我已经尝试在我的test.py中导入sgmllib并且这样可行,所以我不明白为什么在尝试为路透社Parser运行构造函数时找不到它。

1 个答案:

答案 0 :(得分:3)

您的问题不是您的代码,而是您运行它的内容。如果您阅读错误及其密切显示的代码:

  File "D:\Projects\Reuters\ReutersParser.py", line 38, in __init__
    SGMLParser.__init__(self, verbose)
NameError: global name 'sgmllib' is not defined

你会发现在Python认为产生这个错误的行上没有引用'sgmllib'。这意味着两件事之一:错误不是源自那里(并且Python非常困惑),或者显示的代码不是正在执行的代码。例如,当您在不在代码执行之间重新启动Python解释器的IDE中运行代码时,后者非常常见。它将执行您的旧代码,但在显示回溯时将显示新代码。我猜你在过去的某个时刻在那条线上做过sgmllib.SGMLParser.__init__(self, verbose)

通过重命名类修复它的原因可能是你做了一些事情 - 比如编辑代码 - 导致IDE重新启动解释器,正确清理它或(偶然)重新加载正确的模块正确的方式来查看新代码。既然你在课程之后命名你的模块(顺便说一下,这是一种糟糕的风格),我假设你在重命名你的课程时重命名了你的模块,所以你的IDE这次选择了新的代码。当然,直到下一次发生同样的事情。