Python全局名称未定义

时间:2013-07-13 21:03:14

标签: python

我正在尝试测试以下简单对象:

class WebCorpus(object):
    def __init__(self):
        _index = {}
        _graph = {}
        _ranks = {}
        _corpusChanged = False

    def lookup(self, keyword):
        if keyword in _index:
            return _index[keyword]
        return None
# (some irrelevant code)

使用:

from WebCorpus import WebCorpus

def test_engine():
    print "Testing..."
    content = """This is a sample <a href="http://www.example.com">webpage</a> with 
    <a href="http://www.go.to">two links</a> that lead nowhere special."""
    outlinks = ["http://www.example.com", "http://www.go.to"]

    corpus = WebCorpus()
    assert corpus.lookup("anything") == None
#(some more code)
test_engine()

但它给了我一个错误:NameError:未定义全局名称'_index'。我不明白这一点,__init__中明确定义了_index!这里我的错误是什么? 帮助赞赏。

2 个答案:

答案 0 :(得分:4)

为了在类方法中设置类变量,您应该使用self

class WebCorpus(object):
    def __init__(self):
        self._index = {}
        self._graph = {}
        self._ranks = {}
        self._corpusChanged = False

    def lookup(self, keyword):
        if keyword in self._index:
            return self._index[keyword]
        return None

或者,您可以简化代码并设置这样的变量(我还简化了lookup方法):

class WebCorpus(object):
    _index = {}
    _graph = {}
    _ranks = {}
    _corpusChanged = False

    def lookup(self, keyword):
        return self._index.get(keyword)

注意,第二个示例与第一个示例不同,因为使用了类级变量,请参阅下面的注释。

答案 1 :(得分:2)

这里发生的是它定义_index但在运行__init__后丢失它。您应该将self附加到所有内容,因此它是self._index等。这适用于整个班级,而不仅仅是__init__