名称错误:全局名称未定义。

26
我在 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()
4个回答

30

你需要做:

import sqlitedbx

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

if __name__ == "__main__":
    main()

2
@Wizzard:因为这就是Python中模块、变量和属性的工作方式。 - Roger Pate
13
因为 import sqlitedbx 会将 sqlitedbx.py 导入到当前名称空间中。如果你不想在使用时加上文件名前缀,可以在脚本的名称空间中以不同的方式导入它:使用 from sqlitedbx import SqliteDB - Tamás
1
@Tamás谢谢,您的评论帮助我理解了为什么我遇到了类似的问题! - BBog

5

尝试

from sqlitedbx import SqliteDBzz

@Wizzard:请注意,这与“import sqlitedbx”加上“SqliteDBzz = sqlitedbx.SqliteDBzz”相同(如果您想要技术细节,请接着写上“del sqlitedbx”)。 - Roger Pate

3

导入命名空间会更加清晰。想象一下你要导入两个不同的模块,它们都有相同的方法/类。可能会发生一些不好的事情。我敢说通常最好的做法是使用:

import module

完成

from module import function/class

0

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

from sqlitedbx import SqliteDBzz

这样你就可以直接使用名称而不需要包含模块。或者只需导入模块并在函数、类等前面添加“sqlitedbx.”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接