ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

python: With文の使い方(スコープ内の関数の使い方)

備忘録です。よく使っているwith open()。これがどういう仕組みでこのWithを使うことで都合のいい関数が作れるという話を読んだので備忘録です。

 

会社では、pythonとか自分のPCに入れられないので、最近、VBAを使って若干の暇つぶしをしています。そしてそのVBAでもWithを使う機会がありました。Withのスコープの中に(.)で繋いでひとまとめに、処理を入れることができる。便利だなあと思いました。

 

そして最近読んでいる本で、pythonのwithについて書かれていました。こういう仕組みなのかと思ったのと自分で作る関数にも適用できるようなので忘れないようにの記事です。

 

PtyhonのWith文の使い方

withを使用するとwithブロックに入る時の処理(前処理)とwithブロックを抜ける時の処理(後処理)を自動で行うことができるようです。つまり、withブロックの中にいるときだけのモードを作ることができる!ということ。便利。

 

with open()

自分もよく使うのが、with open()ですが、これはwithブロックに入る時にファイルをopenして、withブロック内で処理を行い、withブロックを抜ける時にcloseしてくれます。

 

withを使わない場合は下記のような流れ

①f = open('sample.txt', 'w')
②f.write('hello world!')
③f.close()

そして、withを使うときはwithに入る時に①、withの中で②、withを抜けるときに③を行ってくれるようです。

 

 

関数をwithスコープ内で実行する

ということで、withは自分で作る関数を使う時にも、とても便利そうです。

 

ある関数をwithスコープ内で実行させる作り方
# contextlibというライブラリをインポートします
import contextlib

# デコーダーをつけて、その下に関数を作ります @contextlib.contextmanager def config_test(): # yieldの前に前処理を記述 前処理
try: yield # yieldの後に後処理を記述 finally: 後処理

# 関数を使用する
with config_test(): 処理

 

ポイントは、yeildの前後に前処理と後処理を記述すること。これでwithスコープに入ると前処理を行い、抜けると後処理を行なってくれます。

 

また、この関数を実際にwithとともに使うときにwithスコープ内での処理を書けばOKです。

 

※ withブロックでは例外が発生する可能性があるようなのでyieldはtyrで囲もうということでした!!