剛剛開始學python,今天在乙個基礎例子中看到了一行**,覺得很有意思,就去研究了一下
with
open("../config/name_login.txt",'r') as f:
其實這是python中的with語句,類似於php中的try()……catch(),主要是用來檔案處理,你需要的是獲取乙個檔案控制代碼,然後從檔案讀取資料,然後處理資料,最後關閉檔案
在php中你可以這樣寫
<?php
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize ($filename));
fclose($handle);
?>
這個是比較簡單的例子,通常我們會假如try(),catch()來處理異常
<?php
try catch (exception
$e)
?>
在學習完python的with語句之後你就會發現,這段**實在是太冗長了…………..
那麼,with語句是怎樣工作的呢?
借用其他人的說法:
緊跟with後面的語句被求值後,返回物件的enter() 方法被呼叫,這個方法的返回值將被賦值給as後面的變數。下面例子可以具體說明with如何工作:當with後面的**塊全部被執行完之後,將呼叫前面返回物件的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__()"
defget_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()方法返回的值 - 這個例子中是」foo」,賦值給變數』sample』 3. 執行**塊,列印變數」sample」的值為 「foo」 4.exit()方法被呼叫
看到這裡我是覺得有點像php中的構造方法與析構方法,你有感覺嘛???
要使用 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() 方法。
2.3.
python中with的用法
python中with的用法 清單 1.with 語句的語法格式 1 2 with context expression as target s with body 無論context expression是否發生異常,都能保證不報錯,類似於try finally正規化。enter 語句返回值賦給t...
Python中with的用法
之前再遇到with語句在檔案操作上的用法非常巧妙,以前不太熟悉,看的時候也產生一些困惑 有一些任務,可能事先需要設定,事後做清理工作。對於這種場景,python的with語句提供了一種非常方便的處理方式。其中乙個很好的例子是檔案處理,你需要獲取乙個檔案控制代碼,從檔案中讀取資料,然後關閉檔案控制代碼...
python中 的用法
在python的函式中偶爾會看到函式定義的上一行有 functionname的修飾,當直譯器讀到 這樣的修飾符的時候會優先解除 後的內容,直接就把 的下一行的函式或者類作為 後邊函式的引數,然後將返回值賦給下乙個修飾的函式物件。示例 def function 1 a print function 1...