【问题标题】:NameError: global name is not definedNameError:未定义全局名称
【发布时间】:2011-04-27 23:46:00
【问题描述】:

我在 Mac OS X 上使用 Python 2.6.1。

我有两个简单的 Python 文件(如下),但是当我运行时

python update_url.py

我上了终端:

Traceback (most recent call last):
  File "update_urls.py", line 7, in <module>
    main()
  File "update_urls.py", line 4, in main
    db = SqliteDBzz()
NameError: global name 'SqliteDBzz' is not defined

我尝试以不同的方式重命名文件和类,这就是末端有 x 和 z 的原因。 ;)

文件 sqlitedbx.py

class SqliteDBzz:
    connection = ''
    curser = ''

    def connect(self):
        print "foo"

    def find_or_create(self, table, column, value):
        print "baar"

文件 update_url.py

import sqlitedbx

def main():
    db = SqliteDBzz()
    db.connect

if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python class namespaces


    【解决方案1】:

    你需要做的:

    import sqlitedbx
    
    def main():
        db = sqlitedbx.SqliteDBzz()
        db.connect()
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • @Wizzard:因为这就是 Python 中模块、变量和属性的工作方式。
    • 因为import sqlitedbxsqlitedbx.py 导入到它自己的命名空间中。如果您不想为其添加文件名前缀,请将其导入脚本的命名空间:from sqlitedbx import @Wizzard: SqliteDBzz
    • @Tamás 谢谢你,你的评论帮助我理解了为什么我遇到了类似的问题!
    【解决方案2】:

    试试

    from sqlitedbx import SqliteDBzz
    

    【讨论】:

    • @Wizzard:请注意,这与“import sqlitedbx”加上“SqliteDBzz = sqlitedbx.SqliteDBzz”(如果您想获得技术知识,后跟“del sqlitedbx”)相同。
    【解决方案3】:

    导入命名空间更加简洁。想象一下,您导入了两个不同的模块,它们都具有相同的方法/类。可能会发生一些不好的事情。我敢说这通常是一种很好的做法:

    import module
    

    结束

    from module import function/class
    

    【讨论】:

      【解决方案4】:

      这就是 Python 的工作原理。 试试这个:

      from sqlitedbx import SqliteDBzz
      

      这样您就可以直接使用名称而不使用封闭模块。或者只需导入模块并在前面加上“sqlitedbx”。到你的功能,类等

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-24
        • 2012-05-29
        • 2013-08-23
        • 2014-04-03
        • 2017-05-12
        • 2015-09-01
        • 2012-03-10
        相关资源
        最近更新 更多