當前位置:首頁 » 編程語言 » withpython

withpython

發布時間: 2023-06-15 03:02:21

『壹』 揭秘 python 中的 with 關鍵字

正文

你有沒有想過 with 語句是什麼以及我們為什麼使用它呢?請閱讀這篇文章!我們中的許多人在 Python 代碼中一遍又一遍地看到這個代碼片段: with open( 'Hi.text' , 'w' ) as f:
f.write( "Hello, there" )

但是,我們中的一些人不知道 with 有什麼用,以及為什麼我們需要在這里使用它。在此閱讀中,您將找到關於 with 可解決的幾乎所有問題。讓我們開始吧!


首先,讓我們考慮一下如果不使用 with 關鍵字我們需要做什麼。在這種情況下,我們需要先打開文件並 嘗試 執行 write 。不管成功與否,我們最好在 最後 關閉它,所以我們的代碼將如下所示:

f = open( 'Hi.text' , 'w' )
try :
f.write( 'Hello, there' )
finally :
f.close()

那麼, with 關鍵字有什麼用呢?它只是有助於將我們的 try..finally 代碼縮短為 with... 的單個語句!這就是 with 語句用法。


那麼,它到底是什麼?事實上, with 語句本身在 Python 中並沒有什麼特別之處,它只是 Python 中 上下文管理器 的一個特性。 上下文管理器 ,引用自 Python 官方文檔, 是一種讓您在需要時准確分配和釋放資源的方法 ,或者簡單來說: 當您在某些資源上做某事時縮短您的代碼片段 ,這意味著您可以自己定義 with 語句的用法!


我們如何做到這一點?嗯,很簡單,你只需要實現兩個 魔術函數 :一個叫做 __enter__ ,另一個叫做 __exit__ 。第一種方法是編寫一個實現這兩個函數的類,如下所示:

class My_file :
def __init__ (self, fname):
self.fname = fname
def __enter__ (self):
self.file = open(self.fname, 'w' )
return self.file
def __exit__ (self, exc_type, exc_val, exc_trace_back):
if self.file:
self.file.close()

在這里,我們創建了一個普通的 Python 類,實現了兩個魔術函數。注意這兩個函數的簽名: __enter__ 只接受 self ,而 __exit__ 將接受更多參數,示例中的這三個是標准形式。這樣,我們就可以直接使用:

with My_file( 'hello.txt' ) as f:
f.write( 'hello, world!' )

這里的 with 語句會先調用 __init__ 構造一個新對象,然後再調用 __enter__ 方法;最後,它會在代碼塊完成之前觸發 __exit__ 方法。所以,上面代碼的大致等價如下:

myfile = My_file( 'hello.txt' )
f = myfile.__enter__()
f.write( 'hello, world!' )
myfile.__exit(...)

實現 上下文管理器 的第二種方法是通過 裝飾器 ,如下:

1.你 import contextmanager from contextlib

2.你寫一個函數來實現你想要的 with 語句。

3.在函數上方添加一個裝飾器 @contextmanager 。

4.使用你的 with your_function !


根據上面的介紹,讓我們寫一個 裝飾器上下文管理器

from contextlib import contextmanager
@contextmanager
def my_file_open (fname):
try :
f = open(fname, 'w' )
yield f
finally :
print( 'Closing file' )
f.close()

with file_open( 'hi.txt' ) as f:
f.write( 'hello world' )

@contextmanager
def closing (f):
try :
f.write( "Finish writing" )
finally :
f.close()

with closing(open( "hi.text" )):
f.write( "hello world" )

例如,在上面的代碼中,我們可以直接調用 with close(your_way_of_getting_resource) ,在你下面寫的代碼塊即將完成之前( f.write("hello world") ),它會執行 try..finally 我們在上面定義的塊。另一個是使用 suppress 工具。我們知道,在很多情況下,如果我們嘗試獲取一些資源,很可能在打開文件時會出現 FileNotFoundException 等錯誤。在某些情況下,我們希望捕獲錯誤或抑制錯誤,以便程序繼續正常運行。 suppress 是我們可以抑制警告的一種方式。你需要做的就是弄清楚你想要抑制哪個異常,並編寫 with suppress(your_choice_of_exception) ,Python 將從這里開始處理它。在其他情況下,您可能只想在輸入 with 代碼塊時執行某些操作。在這種情況下, nullcontext 對你來說會很方便。 nullcontext 只會返回你在 __enter__ 函數中定義的東西,而不會做任何其他事情。如果您在 Python 中處理 async 操作以訪問資源,則 aclosure 是處理這種情況的實用工具。


總結


本文介紹了 with 語句的一些基本概念和用法及其底層工作原理。還有很多有趣的東西,請查看 Python 的 contextlib 文檔。最後,祝您能像往常一樣快樂學習和快樂編碼!

鏈接:https://python.plainenglish.io/demystifying-the-with-keyword-in-python-53be94e8b31a

你還有什麼想要補充的嗎?

『貳』 python中with python中with as 是什麼意思剛入門求解釋!!!

這個語法是用來代替傳統的try...finally語法的。

with EXPRESSION [ as VARIABLE] WITH-BLOCK

基本思想是with所求值的對象必須有一個__enter__()方法,一個__exit__()方法。

緊跟with後面的語句被求值後,返回對象的__enter__()方法被調用,這個方法的返回值將被賦值給as後面的變數。當with後面的代碼塊全部被執行完之後,將調用前面返回對象的__exit__()方法。

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

使用with...as...的方式替換,修改後的代碼是:

withopen("/tmp/foo.txt")asfile:
data=file.read()
#!/usr/bin/envpython
#with_example01.py


classSample:
def__enter__(self):
print"In__enter__()"
return"Foo"

def__exit__(self,type,value,trace):
print"In__exit__()"


defget_sample():
returnSample()


withget_sample()assample:
print"sample:",sample

執行結果為

In__enter__()
sample:Foo
In__exit__()

1. __enter__()方法被執行

2. __enter__()方法返回的值 - 這個例子中是"Foo",賦值給變數'sample'

3. 執行代碼塊,列印變數"sample"的值為 "Foo"

4. __exit__()方法被調用with真正強大之處是它可以處理異常。可能你已經注意到Sample類的__exit__方法有三個參數- val, type 和 trace。這些參數在異常處理中相當有用。

請採納!

『叄』 python中with是什麼意思

關鍵字

with 的一般執行過程
一段基本的 with 表達式,其結構是這樣的:
with EXPR as VAR:
BLOCK
其中: EXPR 可以是任意表達式; as VAR 是可選的。

『肆』 python的with語句怎樣嵌套使用

with obj1:
with obj2:
obj1 xxx
obj2 xxx
# 你自己的代碼

這樣就可以了

『伍』 python35個保留字是什麼

python35個保留字是['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']。

Python已經被移植在許多平台上(經過改動使它能夠工作在不同平台上)。這些平台包括linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS。

Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基於linux開發的android平台。


規范的代碼:

Python採用強制縮進的方式使得代碼具有較好可讀性。而Python語言寫的程序不需要編譯成二進制代碼。Python的作者設計限制性很強的語法,使得不好的編程習慣(例如if語句的下一行不向右縮進)都不能通過編譯。

其中很重要的一項就是Python的縮進規則。一個和其他大多數語言(如C)的區別就是,一個模塊的界限,完全是由每行的首字元在這一行的位置來決定(而C語言是用一對大括弧「{}」(不含引號)來明確的定出模塊的邊界,與字元的位置毫無關系)。

通過強製程序員們縮進(包括if,for和函數定義等所有需要使用模塊的地方),Python確實使得程序更加清晰和美觀。

『陸』 python with函數怎麼用

with在python中並不是函數,是一個關鍵詞語句,比如if就是關鍵詞語句。

with大多用來打開一個文檔。
比如:
with open('test.txt') as f:
f.read()

這樣就可以讀取名為test的文檔里的內容,並且使用with語句不需要我們手動再調用文件的close()方法來關閉文件,如果test.txt文檔對象不再被使用,with會自動關閉文檔。比較智能一點。

『柒』 python中with語句的作用

with語句相當於你定義一個類的時候定義了__enter__()和__exit__()這個兩個方法。
在我們進行文件操作的的時候會用到open方法,後面有了with open以後就不再只使用open方法了,為什麼?因為with open方法簡單,我們不用再去管關閉文件了,即使中間發生異常,with open也會幫我們把文件關閉掉,以下示例演示下with open方法;
class File(object):
"""文件操作類"""
def __init__(self, filepath, mode):
self.filepath = filepath
self.mode = mode

def __enter__(self):
"""打開文件"""
self.file = open(self.filepath, self.mode)
print("打開文件")
return self.file

def __exit__(self, exc_type, exc_val, exc_tb):
"""關閉文件"""
print("關閉文件")
self.file.close()

if __name__ == '__main__':
with File('log.log', 'r') as file:
file.write("家啊")

可以看出來有了__enter__()和__exit__(),我們自定義的類也可以使用with了

熱點內容
比格雲伺服器好用不 發布:2025-02-12 21:23:00 瀏覽:219
砍價php 發布:2025-02-12 21:21:17 瀏覽:754
c語言函數返回值是數組 發布:2025-02-12 21:21:16 瀏覽:698
pow在c語言中什麼 發布:2025-02-12 21:07:24 瀏覽:320
php查詢mysql連接 發布:2025-02-12 21:05:45 瀏覽:632
linuxc當前時間 發布:2025-02-12 21:03:32 瀏覽:28
雲鎖神伺服器 發布:2025-02-12 21:03:29 瀏覽:487
c語言int和float 發布:2025-02-12 21:03:24 瀏覽:20
我的世界有什麼好玩的大伺服器 發布:2025-02-12 21:01:59 瀏覽:98
方舟手游如何解鎖自己的伺服器 發布:2025-02-12 20:54:09 瀏覽:657