在尝试使用我编写的类时,我得到了一个奇怪的NameError实例。在目录中,我有以下文件结构:
我在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运行构造函数时找不到它。
答案 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这次选择了新的代码。当然,直到下一次发生同样的事情。