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 sqlitedbx
将sqlitedbx.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''