2016-09-22 24 views
1

を割り当てますwithステートメントのasスーツのVARを、withのスコープにバインドされたグローバル変数にすることはできますか? f変数以下の例でに割り当てられても外withwith文の後:スーツはglobly with with文、python

with open("some_text.txt") as f: 
    pass 

print(f.closed) 
print(f) 

これが返されます。

>>> True 
<_io.TextIOWrapper name='some_text.txt' mode='r' encoding='UTF-8'> 

as VARは、まだ私は内部のwithを使用していてもバインドされています関数:

def longerThan10Chars(*files): 
    for my_file in files: 
     with open(my_file) as f: 
      for line in f: 
       if len(line) >= 10: 
        print(line) 
    print(f.closed) 

ここで、f.closedはまだ0を出力します。。

+0

'with..as'ブロックの後に' f'をアンバインドしたいと言っていますか? –

+0

@PatrickHaughはい、それは私が言っていることです。 – amirteymuri

+0

できません。 Pythonにはこのようなきめ細かなスコープはありません。 –

答えて

4

Pythonスコープの境界は関数です。 withをスコープブロックするオプションはありません。それを別のスコープにする必要がある場合は関数に入れます。 asターゲットはまったく別のローカルであり、その新しい機能の外には存在しません。

それとも、名前だけで明示的に名前を削除してwith文の後に離れて行くことができます:やるfの結合を削除するには

with open("some_text.txt") as f: 
    pass 

del f 
+0

'as'変数はまだ関数の中でもバインドされているようです。私の更新を見てください。だから 'del'だけが動くだろう。 – amirteymuri

+0

彼は関数に 'f'が割り当てられているすべてのコードをカプセル化し、次に関数の外側で' f'を割り当て解除するすべての作業を行うことを意味します。 –

+0

Aaah、今すぐ取得しました。 – amirteymuri

-1

del locals()['f'] 

あなたはこれをしなければなりません手動でwith...asブロックではこれを行うことはできません。

+0

なぜ間接ですか? 'del f'ははるかに直接的なものです。 'f'はここでは動的ではありません。 'locals()'は関数内の実際のlocals配列を反映しているだけなので、 'locals()' *からの削除は実際のlocals *には影響しません。 –

+0

つまり、あなたが提案しているのは、関数の外で* global *レベルでしか動作しません。 'locals()'はモジュールの実際の名前空間であるglobals()と同じ辞書を返します。直接編集することができます。 –