スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告


with文

with文を試しました。

Pythonリファレンスマニュアルから引用
with 文は、ブロックの実行を、コンテキストマネージャによって定義されたメソッドでラップするために使われます( 3.4.9 セクションを参照してください)。これにより、よくある try...except...finally 利用パターンをカプセル化して便利に再利用することができます。



何を書いているかイマイチ判りませんね。
具体的な使い道として、open() と close()が対になっているライブラリよく使われます。

ファイルのオープンとクローズで試してみましょう。


def main():
print('[1]')
#ファイルオープン
with open('test.txt', 'w') as fp: #fpにファイルオブジェクトが入る
fp.write('hello world\n') #ファイルに書き込み
fp.write('hello python') #ファイルに書き込み

with open('test.txt', 'r') as fp:
for line in fp: #ファイル読み込み
print(line)

if __name__ == '__main__':
main()


結果


[1]
hello world

hello python



with文のスコープが抜けるところで、ファイルオブジェクトのclose()が呼ばれ、ファイルオブジェクトは解放されます。

この動作は、C#のusingとよく似ています。






では、実際に、with文の使えるクラスを作ってみましょう。
with文で使えるようになるには、クラスに__enter__()と__exit__()を定義する必要があります。

with文を使ったとき、__enter__()が呼ばれ、スコープを抜けるときに__exit__()が呼ばれます。
__exit__()には、selfのほか、3つの引数が必要です。例外が発生した場合、この引数に、情報が入れられます。

お試しソースです。


class withtest:
def __init__(self):
print('__init__')
def __del__(self):
print('__del__')
def __enter__(self):
print('__enter__')
#raise #例外を入れてみる
return self
def __exit__(self, exc_type, exc_value, traceback):
print('__exit__')
close(self)
if (exc_type!=None):
#return True #例外を抑制するには
return False #例外を伝播する
def close(self):
print('close()')
def test_except(self):
print('raise_except')
raise
def test_print(self, txt):
print(txt)

def open():
return withtest()


def main():
try:
with open() as w:
print(type(w))
w.test_print('hogehoge')
w.test_except()
except:
print('例外')

if __name__ == '__main__':
main()


結果


__init__
__enter__
<class '__main__.withtest'>
hogehoge
raise_except
__exit__
close()
例外
__del__



with文を使った場合、
 __init__() → __enter__() → 処理 → __exit__() → __del__()
の順で処理が行われます。

処理の部分で、例外が発生しても、ちゃんと__exit__()が呼ばれ、close()が呼び出されました。



では、__enter__()にある、# raiseの コメントをはずしてみましょう。


__init__
__enter__
例外
__del__



すると、__exit__()が呼ばれなくなります。



では、__enter__()の raiseをコメントアウトし、__exit__()の return True を return Falseにしてみましょう。


__init__
__enter__
<class '__main__.withtest'>
hogehoge
raise_except
__exit__
close()
__del__



すると、test_except()で例外をスローしたにもかかわらず、その例外は__exit__()の中で握りつぶされます。


with文は便利機能なので、使用できるライブラリでは、積極的に使っていきましょう。


スポンサーサイト

2011.02.20 | コメント(0) | トラックバック(0) | 言語リファレンス 基礎





コメント




コメントの投稿


管理者にだけ表示を許可する


«  | ホーム |  »


FC2Ad

プロフィール

Author:Green
WindowsをターゲットとしたSW開発者

メインはC#、C/C++、VB
Pythonは初めて。

ここでは、Python ver3系 (ver.3.1.3を使用中)で説明を行っています。ver.2系とは、結構違うのでご注意ください。

連絡先
連絡先

Python Official Website
Python Official Website

目次

はじめに セットアップ プログラミング基本 ライブラリ オリジナルソフトウェア その他

検索フォーム

QRコード

QR

書籍











その他


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。