Withステートメントとは何ですか?
一部のタスクは、事前に設定し、後でクリーンアップする必要がある場合があります。このシナリオでは、Pythonのwithステートメントはそれを処理するための非常に便利な方法を提供します。良い例はファイル処理です。ファイルハンドルを取得し、ファイルからデータを読み取ってから、ファイルハンドルを閉じる必要があります。
withステートメントを使用しない場合、コードは次のようになります。
file = open("/tmp/foo.txt")
data = file.read()
file.close()
ここには2つの問題があります。1つは、ファイルハンドルを閉じるのを忘れる可能性があることです。もう1つは、ファイル読み取りデータが異常であり、処理が実行されないことです。以下は、例外処理の拡張バージョンです。
file = open("/tmp/foo.txt")try:
data = file.read()finally:
file.close()
このコードはうまく機能しますが、冗長すぎます。これは、withがそのスキルを示すための時間です。より洗練された構文に加えて、withはコンテキストによって生成された例外を処理することもできます。withバージョンのコードは次のとおりです。
with open("/tmp/foo.txt") as file:
data = file.read()
with如何工作?
これは魔法に満ちているように見えますが、魔法だけでなく、Pythonのwithの処理も非常に巧妙です。基本的な考え方は、withによって評価されるオブジェクトには、__ enter __()メソッドと__exit __()メソッドが必要であるということです。
withに続くステートメントが評価された後、返されたオブジェクトの__enter __()メソッドが呼び出され、このメソッドの戻り値がasに続く変数に割り当てられます。withの背後にあるすべてのコードブロックが実行されると、返されたオブジェクトの__exit __()メソッドが呼び出されます。
次の例は、withがどのように機能するかを示しています。
#!/usr/bin/env python
# with_example01.py
class Sample:
def __enter__(self):
print "In __enter__()"
return "Foo"
def __exit__(self, type, value, trace):
print "In __exit__()"
def get_sample():
return Sample()
with get_sample() as sample:
print "sample:", sample
推奨事項:020は継続的に更新され、小さなブティックサークルには毎日新しいコンテンツがあり、乾物の濃度は非常に高くなっています。
接続してテクノロジーについて話し合いたいものはすべてあります。
グループに最初に参加して、仲間をしのぐようにしましょう!(グループへの参加は無料です)
Python開発者とのコミュニケーションと学習については、ここをクリックしてください。
グループ番号:745895701、
アプリケーション時:
Pythonソフトウェアインストールパッケージ、Python実際の戦闘チュートリアル、
Pythonの基本学習、高度な学習、クローラー、人工知能、自動操作とメンテナンス、自動テストなどを含む資料の無料コレクション。
コードを実行すると、出力は次のようになります
In __enter__()
sample: Foo
In __exit__()
ご覧のように、
1. __enter __()メソッドが実行されます
2. __enter __()メソッドによって返される値-この例では「Foo」、変数「sample」に割り当てられています
3.コードブロックを実行し、変数「sample」の値を「Foo」として出力します。
4. __exit __()メソッドが呼び出されます
withの真の力は、例外を処理できることです。Sampleクラスの__exit__メソッドには、val、type、traceの3つのパラメーターがあることに気付いたかもしれません。これらのパラメーターは、例外処理に非常に役立ちます。コードを変更して、どのように機能するかを見てみましょう。
#!/usr/bin/env python
# with_example02.py
class Sample:
def __enter__(self):
return self
def __exit__(self, type, value, trace):
print "type:", type
print "value:", value
print "trace:", trace
def do_something(self):
bar = 1/0
return bar + 10
with Sample() as sample:
sample.do_something()
この例では、withの後のget_sample()はSample()になります。に続くステートメントによって返されるオブジェクトに__enter __()メソッドと__exit __()メソッドがある限り、これは問題ではありません。この例では、Sample()の__enter __()メソッドは、新しく作成されたSampleオブジェクトを返し、それを変数sampleに割り当てます。
コードが実行された後:
bash-3.2$ ./with_example02.py
type: <type 'exceptions.ZeroDivisionError'>
value: integer division or modulo by zero
trace: <traceback object at 0x1004a8128>
Traceback (most recent call last):
File "./with_example02.py", line 19, in <module>
sample.do_something()
File "./with_example02.py", line 15, in do_something
bar = 1/0
ZeroDivisionError: integer division or modulo by zero
実際、に続くコードブロックで例外がスローされると、__ exit __()メソッドが実行されます。例が示すように、例外がスローされると、関連付けられたタイプ、値、およびスタックトレースが__exit __()メソッドに渡されるため、スローされたZeroDivisionErrorが出力されます。ライブラリを開発するとき、リソースのクリーンアップ、ファイルのクローズなどの操作はすべて__exit__メソッドに配置できます。
したがって、Pythonのwithステートメントは、コードをより簡潔にするための効果的なメカニズムを提供すると同時に、例外が発生した場合のクリーンアップが容易になります。