2016-06-21 4 views
1

すべてのロジックを無視すると思われるpythonパッケージで、奇妙な "unbound local"エラーが発生しました。私はそれを再現するためにMWEを得ることはできませんが、簡潔に説明しようとし、誰かが何が起こっているのかについて何らかの説明をしてくれることを願っています。インポートされたモジュールが有効範囲外になりました(バインドされていないローカルエラー)

moduleは私が開発したパッケージであり、Modelmoduleのクラスです。

import module 

class Model: 
    def __init__(self): 
     print module 

    def run(self): 
     print module 

、私はこのようなスクリプトでModelをインスタンス化:

from model import Model 
m = Model() 
m.run() 

module成功し__init__内のプリントが、私Modelクラス(model.py)の定義は次のようになりますrun関数内のバインドされていないローカルエラーを取得します。

私は、私がrun()機能でprint module行の直前にPDBトレースを追加した場合、その後、私が正常に結合していないローカルエラーなしprint moduleを実行することができますので、物事は本当に奇妙だところで、PDB、でこれを診断しようとしました私が次の行に進むと、エラーがスローされます。 moduleはどのようにして__init__()の範囲にあり、pdbの範囲にありますが、run()の範囲にはありませんか?

MWEがないのでこれは理想的ではありませんが、完全なコードのコンテキスト外でこれを再現することはできません。誰かが何が起こっているのかを知り、さらにデバッグするための戦略を提案することを期待しています。

+0

です。完全なスタックトレースを教えてもらえますか?それは、それがあなたが思っているところの、束縛されていない地方であることを確認するための診断に役立ちます。 – Delioth

答えて

3

明らかに、関数runのどこかにmoduleという名前のローカル変数があります。たとえば、次のコードは、したがって、ここでsys = NoneUnboundLocalError

import sys 

def run(): 
    print sys 
    sys = None 
run() 

がまだ定義されていないrun内側とprintがそれを呼び出した時点での輸入sysをシャドウローカル名を紹介し、エラーをスローします。インポートされたモジュールをrun内で使用するには、ローカル変数を見つけて名前を変更する必要があります。 Pythonスコープ規則の詳細はhere

+0

これはまさにそれではありませんでしたが、それは私を答えに導きました。問題の根本と思われるrun()ブロック内に "import module.function"コールがあります(質問しません)。一度私はそれを見つけた簡単な修正...ありがとう! –

関連する問題