2017-06-08 18 views
2

と外のpython変数を使用して、私はwith文の中に定義された変数に遭遇しましたが、それは、次の例ではfileのように、文の外で使用された:Pythonスクリプトで声明

with open(fname, 'r') as file: 
    pass 
print(file.mode) 

直感的に、私はwithの文の外側にはfileが存在してはならないとし、これは偶然にしか動作しないと言います。これがうまくいくかどうかについては、Pythonのドキュメントで決定的な声明を見つけることができませんでした。このタイプのステートメントは、(将来のPythonバージョンのために)安全に使用できますか、それとも避けるべきですか? Pythonのドキュメントにあるこの情報へのポインタも非常に役に立ちます。

+1

あなたが投稿したコードすべきではない。コンテキストマネージャ(withブロック)を離れると、ファイルが閉じます。 **私は正しかった。下記のコメントを参照してください。** –

+0

@WillDaSilvaあなたはそれを試しましたか?それはPython 2.7の私のために働いています – asongtoruin

+3

'file.mode'はファイル自体にアクセスするのではなく、Pythonオブジェクトだけにアクセスします。 – Octaviour

答えて

1

可変範囲は、function,moduleおよびclassレベルにのみ適用されます。あなたは同じ機能/モジュール/クラス内にある場合は、定義されたすべての変数は関係なく、それはwithforifなどのブロック内で定義されたかどうか、その機能/モジュール/クラス内で利用できるようになります。たとえば、この

を:

for x in range(1): 
    y = 1 
print(y) 

with文を使用して、あなたの一例として、(無意味ではあるが)同じように有効です。ブロックが、この場合のように、入力されることはありません場合は、コードブロック内で定義された変数が実際に定義されていない可能性がありますので、

しかし、あなたは注意する必要があります:

try: 
    with open('filedoesnotexist', 'r') as file: 
     pass 
except: 
    pass # just to emphasize point 

print(file.mode) 

Traceback (most recent call last): 
    File "<pyshell#43>", line 1, in <module> 
    file.mode 
NameError: name 'file' is not defined 

Good description of LEGB rule of thumb for variable scope