代码之家  ›  专栏  ›  技术社区  ›  Michael Herold

尝试使用用户定义类时出现python nameerror

  •  3
  • Michael Herold  · 技术社区  · 14 年前

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

    • 迪尔/
      • 路透社.py
      • Py
      • 通用汽车公司

    在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,这是一个内置模块。我绞尽脑汁想弄清楚为什么导入不起作用。

    是什么导致了这个名字错误?我试过在test.py中导入sgmllib,这很有效,所以我不明白为什么在为reutersparser运行构造函数时找不到它。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Thomas Wouters    14 年前

    你的问题不是你的代码,而是你运行的代码。如果您仔细阅读错误和代码,它将显示:

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

    您会注意到在python认为产生此错误的行中没有对“sgmllib”的引用。这意味着以下两点之一:要么错误不是源于此(python很混乱),要么显示的代码 不是正在执行的代码 . 例如,当您在一个ide中运行代码时,在代码执行之间不重新启动python解释器时,后者非常常见。它将执行旧代码,但显示回溯时将显示新代码。我猜是你干的 sgmllib.SGMLParser.__init__(self, verbose) 在过去的某个时候。

    通过重命名类修复它的原因可能是您做了一些事情——比如编辑代码——导致IDE重新启动解释器,正确地清理它,或者(意外地)以正确的方式重新加载了正确的模块,以便它看到新的代码。由于您是以类命名模块的(顺便说一句,这是一个糟糕的样式),所以我假设您在重命名类时重命名了模块,所以这次您的ide使用了新代码。当然,直到下次发生同样的事情。