Python with語句


 

 

直接把參考的文章放上面吧 :這個更專業,可以直接看這個。

https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/

之前在有些教程中看到了如下的的代碼:

1 with open("/tmp/foo.txt") as file:
2     data = file.read()

居然也可以這么寫。具體是什么意思呢,with是怎么用的。

廢話不多說,以下是我自己的理解:

首先with的作用:  

使用with后不管with中的代碼出現什么錯誤,都會進行對當前對象進行清理工作。

例如file的file.close()方法,無論with中出現任何錯誤,都會執行file.close()方法

 

 

其次with只有特定場合下才能使用。,這個特定場合只的是那些支持了上下文管理器的對象。

這些對象有:

1 file
2 decimal.Context
3 thread.LockType
4 threading.Lock
5 threading.RLock
6 threading.Condition
7 threading.Semaphore
8 threading.BoundedSemaphore

 

那么什么是上下文管理器:

  這個管理器就是在對象內實現了兩個方法:__enter__() 和__exit__()

  __enter__()方法會在with的代碼塊執行之前執行,__exit__()會在代碼塊執行結束后執行。

  __exit__()方法內會自帶當前對象的清理方法。

 

with語句類似

  try :

  except:

  finally:

的功能:但是with語句更簡潔。而且更安全。代碼量更少。

 

with 用法:

格式:

    with context_expression [as target(s)]:
        with-body

例子:

    with open(r'somefileName') as somefile:
        for line in somefile:
            print line
            # ...more code

 

with后面為一個表達式,表達式返回的是一個上下文管理器對象,我的理解就是表達式的返回結果。使用as 可以將這個結果賦值給某個變量。方便之后操作。

一個感覺更牛掰的例子:

nested 函數:

    with nested(A(), B(), C()) as (X, Y, Z):
         # with-body code here

等同於:

    with A() as X:
        with B() as Y:
            with C() as Z:
                 # with-body code here

直接with后面的表達式就是個方法。並且把連着三個函數的方法直接賦值給不同變量。

上下文管理器可以自定義。也可以重寫__enter__()和__exit__()方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM