NameError:未定义全局名称

Posted

技术标签:

【中文标题】NameError:未定义全局名称【英文标题】:NameError: global name is not defined 【发布时间】: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()

【问题讨论】:

【参考方案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”。到你的功能,类等

【讨论】:

以上是关于NameError:未定义全局名称的主要内容,如果未能解决你的问题,请参考以下文章

熊猫不进口吗? 'NameError:未定义全局名称'pandas''

NameError:未定义全局名称“QColor”

NameError:未定义全局名称“lower”

NameError:未定义全局名称

DD.close() NameError: 全局名称 'DD' 未定义

NameError:未定义全局名称“myLogFile”