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

时间:2011-07-26 09:09:16

标签: python scope while-loop

我认为不需要持续的低调,我只是想在这里学习!

One.py

from two import *

ADooDah = Doodah()
something = Thing(ADooDah)

something.DoThis()
something.DoThat
something.DoAnother
if (something.has_done_stuff() == True)
    self.SomeFunction

Two.py

class Thing(var):
    def __init__(self, var)
        self.SomeVar = var

    def has_done_stuff(self):
        while True:
            id, newMessage = SomeVar.get_next_message()
            if id == 0:
                return true
            else:
                return false

我明白了......

Traceback (most recent call last):
  File "C:\One.py", line 9, in <module>
    has_done_stuff = thing.HasDoneStuff()
NameError: global name 'thing' is not defined

编辑:代码确实充满了错误。我试图展示我的情况,而不是任何真正的代码。匆忙打字会导致愚蠢的打字。即便我也不是那么糟糕!好吧,大部分时间;)。

我希望这些编辑能让一切变得更有意义,而且你们可以停止关注疯狂的语法错误,并解释一下我的范围(我假设)问题。我是Python / IronPython的新手,关于隐式类型和范围的规则我还在学习中!

我已经解决了我的问题。谢谢。事实证明,这与上述情况完全无关。

3 个答案:

答案 0 :(得分:3)

Something = Thing(ADooDah)

thing.DoThis()

您的thing被称为Something。 此外,您的班级Thing没有您正在呼叫/不呼叫的方法(丢失的parens)。这几乎是无意义的代码。

答案 1 :(得分:2)

有一些问题:

您声明Thing已在Two.py中定义。如果是这样,您需要导入它:

from Two import Thing

或(不推荐):

from Two import *

接下来,您需要class,而不是Class

接下来,您需要定义尚未完成的thing。我会猜测你希望thing成为Thing对象:

thing = Thing(ADooDah)

然后在评论中有人在if里面提到HasDoneStuff的问题,以及Thing不完整的事实(在另一个答案中也提到过)。< / p>

答案 2 :(得分:1)

我提供以下代码。

我不知道它们的用途......但它们可以运行。

<强> two.py

from time import time

class Thing():
    def __init__(self, var):
        self.SomeVar = enumerate(var)

    def HasDoneStuff(self):
        while True:
            id, newMessage = self.SomeVar.next()
            print newMessage
            print 'id==',id
            return id == 0

    def DoThis(self):
        print "DoThis' result"

    def DoThat(self):
        print 'DoingThat ;;;;;;;;;;;;;;;;;;;;;'

    def DoAnother(self):
        print 'DoAnother time',time()

    def SomeFunction(self):
        print 'Humpty Dumpty sat on a wall'

<强> one.py

from two import *


def Doodah(ss):
    return ss.split()

ADooDah = Doodah('once upon a time')

Something = Thing(ADooDah)


Something.DoThis()
Something.DoThat()
Something.DoAnother()

print '\n==========================\n'

while True:
    try:
        if Something.HasDoneStuff():
            Something.SomeFunction()
        print '---------------'
    except StopIteration:
        print "That's all folks"
        break