用法パイソン(転載)

オリジナル住所ます。https://www.cnblogs.com/wanglei-xiaoshitou1/p/9238275.html

 

まず、声明で何がありますか?

いくつかのタスクがありますが、事前に設定され、その後クリーンアップ作業を行う必要があります。このシナリオでは、ステートメントで、Pythonは非常に便利な方法を提供します。良い例は、ファイルハンドルで、あなたはファイルからデータを読み取るために、ファイルハンドルを取得し、ファイルハンドルをクローズする必要があります。

以下のように、ステートメントを使用していない場合:

file = open("/tmp/foo.txt") data = file.read() file.close()

2つの問題があります。

一つは、ファイルハンドルを閉じるのを忘れてもよく、 
第二は、任意の処理を行わず、異常データファイル読み出しの発生です。

ここでは、異常強化されたバージョンとの契約は、次のとおりです。

try:
    f = open('xxx') except: print 'fail to open' exit(-1) try: do something except: do something finally: f.close()

このコードはうまく動作しますが、それはあまりにも面倒です。

この時間は、時間と行くです。よりエレガントな構文に加えて、環境のも良いハンドルの例外コンテキストを持ちます。

次は、とのコードのバージョンです。

with open("/tmp/foo.txt") as file: data = file.read()
-----------------------------------------------------------------------------------------------------------------------------
二、
どのように動作しますか?

後者の文に追いついが評価された後、返されたオブジェクトの__enterの__()メソッドが呼び出され、このメソッドの戻り値は、変数として、後者に割り当てられます。 
全て後者とのブロックが完全に実行された後、前方物体への呼び出し__exit __()メソッドを返します。

次の例では、それがどのように動作するかを指定することができます。

#!/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

 

コードを実行し、次の出力

bash-3.2$ ./with_example01.py
In __enter__() sample: Foo In __exit__()
あなたが見ることができるよう1. __enter __()メソッドは2 __enter __()メソッドを実行する値を返す-この例での変数「サンプル」3.コード・ブロックが実行され、印刷変数「サンプル」に割り当て、「foo」というです値「フー」4. __exit __()メソッドが呼び出された  
本当の力とは、それが例外を扱うことができるということです。あなたは、メソッドのサンプル・クラスは三つのパラメータvalを、種類やトレースがあり__exit__気づいているかもしれません。これらのパラメータは、例外処理に非常に有用です。のは、どのように特定の作業を確認するためにコードを変更してみましょう。
#!は/ usr / envをPythonの/ binに
#のwith_example02.pyのクラスサンプル:
DEF __enter__ (セルフ):
自己返す
DEFの__exit__ (タイプ、値、トレースの、自己を):
印刷"タイプのを:"、タイプの
印刷"値:"、値
印刷"トレース:"、トレース
DEFのdo_something (セルフ):
バー= 1/ 0
リターンバー+ 10
サンプル付き()サンプルとして:
sample.do_something()

この場合には、後者のget_sample有する())(サンプルなります。これは何の関係もありません、ただ声明の後ろのオブジェクトに追いつくが返さ__enter __()と__exit __()メソッドをすることができます。この例では、サンプル()__enterの__の()メソッドは、サンプル新しく作成されたオブジェクトを返し、そして可変サンプルに割り当てられました。

コードの実行:

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 __()メソッドをトレース、従ってスローされた例外ZeroDivisionErrorがプリントアウトされます。リソースをクリーンアップ、ライブラリを開発する場合、メソッドを__exit__配置することができ、ファイル、などの操作を、閉じます。

また、__物事を取り壊すためにexit__加算を、異常を監視し、処理することができ、いくつかのパラメータに注意を払います。例外をスキップするには、ちょうど真の関数に戻ります。

次のサンプルコードは、すべての例外TypeErrorをスキップして、通常はスローその他の例外をできるように。

def __exit__(self, type, value, traceback): return isinstance(value, TypeError)

発現が大幅に簡素化要するに、Asを、各コードのエレガンスは、大きな助けとなる維持することである、仕事最後に書き込み。

複数の項目がある場合は、我々は書くことができます。

with open("x.txt") as f1, open('xxx.txt') as f2: do something with f1,f2

 

したがって、Pythonのwith文は、コードをより簡潔にするための効果的なメカニズムを提供することであるが、異常が発生した場合に、クリーンアップが容易になります。

第三に、関連用語

要使用 with 语句,首先要明白上下文管理器这一概念。有了上下文管理器,with 语句才能工作。 
下面是一组与上下文管理器和with 语句有关的概念。 
上下文管理协议(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持该协议的对象要实现这两个方法。 
上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__() 和 __exit__() 方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。 
运行时上下文(runtime context):由上下文管理器创建,通过上下文管理器的 __enter__() 和__exit__() 方法实现,__enter__() 方法在语句体执行之前进入运行时上下文,__exit__() 在语句体执行完后从运行时上下文退出。with 语句支持运行时上下文这一概念。 
上下文表达式(Context Expression):with 语句中跟在关键字 with 之后的表达式,该表达式要返回一个上下文管理器对象。 
语句体(with-body):with 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 __enter__() 方法,执行完语句体之后会执行__exit__() 方法。

おすすめ

転載: www.cnblogs.com/qyit/p/11646807.html