2010-12-27 10 views
0

私はスコープの問題、おそらく名前空間と呼ばれるものがあると思います。あまりにも私はPythonに新しいです。Python対話モードモジュールのインポート問題

正規表現を使用してリストを検索するモジュールを作成しようとしています。私はそれを行うより良い方法があると確信していますが、私が得ているこのエラーは私を悩まされていると私は理由を理解したい。ここ

は私のコードです:

class relist(list): 
def __init__(self, l): 
    list.__init__(self, l) 

def __getitem__(self, rexp): 
    r = re.compile(rexp) 
    res = filter(r.match, self) 
    return res 

if __name__ == '__main__': 
    import re 
    listl = [x+y for x in 'test string' for y in 'another string for testing'] 
    print(listl) 
    test = relist(listl) 
    print('----------------------------------') 
    print(test['[s.]']) 

私は、コマンドラインからこのコードを実行すると、それは私はそれが期待するように動作します。しかし、私はPythonの対話モードを通してそれを実行すると、対話型モードでは、私は再インポートしないと私は再機能を使用することですが、私が実行しようとしているいくつかの理由でいる間、私はエラー

>>> test['[s.]'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "relist.py", line 8, in __getitem__ 
    r = re.compile(rexp) 
NameError: global name 're' is not defined 

を取得モジュールは動作しません。

私はクラスのスコープにreをインポートする必要がありますか?それは現在のもので見つからない場合は、他のスコープを介してpythonの検索をしないので、私はそうは思わないでしょうか?

私はあなたの助けに感謝し、この検索を行うより良い方法があるなら私は知りたいと思うでしょう。 、

import re 

class .... 

プログラムとして実行したときにのみ、再モジュールをインポートしていない:ありがとう

答えて

1

Pythonは「事前に」何も実行しません。コードに遭遇したときにコードを実行します。 「あらかじめ」行われているのは、ソースコードをバイトコードに変換することだけです。

モジュールをインポートすると、__main__ではなく、__name__がモジュールの名前になります。したがって、末尾のブロックifのコードは実行されず、reはインポートされません。その後、クラスを使用しようとすると、名前reは、(アクセスするために)必要なときにすぐに参照され、見つからない(モジュールが以前にインポートされなかったため)。

2
は、ファイルの先頭に「...もし」ボトムのうち、「輸入再」に移動

モジュールとしてインポートされます。

(。また、Pythonのスタイルが大文字のクラス名を好む)

関連する問題