2011-07-26 32 views
-2

私は、継続的なダウン投票の必要性はないと思いますが、私はここで学びたいと思っています!NameError:グローバル名 'thing'が定義されていません

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と、暗黙的な型やスコープに関するルールはかなり新しく、私はまだ学習中です!

私は私の問題を解決しました。ありがとう。それは明らかに上記とは無関係でした。

+1

one.pyトレースバックが間違っている何を言っている: 'thing'がどこにも定義されていません。他の問題があるので、他のエラーが出てくることを修正したら... – juanchopanza

+1

if条件の中の代入は許されません: 'if(has_done_stuff = thing.HasDoneStuff())'。 (また後で: '場合は、id == 0 'idは=' 0 '、おそらくする必要があります。) – unutbu

+1

' ID = 0の場合: ''または単にない場合はID: ''場合は、id == 0でなければなりません ' – ThiefMaster

答えて

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' 

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 
+0

本当にありがとうございました。私の実際のコードの問題は、私が使っていたスコープと変数の宣言から来たと思います。上記の例では)別の名前空間からのローカルオブジェクトと同じ名前を持つオブジェクトを渡す。私はそれが多くのことをリフレクションを使用していますIronPythonのを使用してインポートの.NETクラスからオブジェクト、あったように、それは多分混乱しましたと思いますか? – tigerswithguitars

+0

@tigerswithguitarsをerrrr ...あなたが説明してくれたすべてを理解できません。アップヴォートをありがとうございます。あなたは公平です。私の答えがあなたにそれほど有用であるとは想像できませんでした。 – eyquem

3
Something = Thing(ADooDah) 

thing.DoThis() 

あなたthingSomethingと呼ばれています。 また、あなたのクラスThingには、あなたが電話している/電話していない(括弧がない)方法はありません。これはほとんど意味のないコードです。

+0

+1、それは確かにナンセンスです。 – juanchopanza

2

いくつかの問題があります。

あなたはThingTwo.pyで定義されていると主張。もしそうなら、あなたはこのようにそれをインポートする必要があります。

from Two import Thing 

か(推奨しません):

from Two import * 

次は、class、ないClassを必要としています。

次に、実行していないthingを定義する必要があります。その後、誰かがコメントで言及したことHasDoneStuff内部ifとpfoblemがある

thing = Thing(ADooDah) 

、およびThingが不完全であるという事実(:私はあなたがthingThingオブジェクトになりたいという野生の推測がかかります別の答えでも言及されている)。

+0

@Auanchopanza +1忍耐のため – eyquem

+0

あなたは正しいです。私は、私の暗黙的で幅広い輸入について少しいたずらしてきました。モジュールに何が入っているのか知っていると、ちょっと汚い習慣です...これはすべてのクラスをインポートするだけではありませんか? *タイプのインポートに関連する他の属性はありますか? – tigerswithguitars

+1

デフォルトでは、モジュール内のすべてをインポートします。 '__all__'で定義された順序で、モジュールからエクスポートしたいシンボルを定義することで、それを制御できます。私は、各シンボルをexplcitlyにインポートする方が良いと思うし、名前空間を保持するためにモジュールをインポートする方がいいと思う(例えば、 'import two'を使い、' Two.Thing'を使う。) – juanchopanza

関連する問題