最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python實現(xiàn)with結(jié)構(gòu)的@contextmanager方法詳解

 更新時間:2023年07月21日 09:36:50   作者:孔天逸  
這篇文章主要介紹了使用Python實現(xiàn)with結(jié)構(gòu)的@contextmanager方法詳解,這個結(jié)構(gòu)的好處,一個是簡潔,一個是當我們對文件操作的邏輯很長的時候,不會因為忘了關(guān)閉文件而造成不必要的錯誤,需要的朋友可以參考下

常見with結(jié)構(gòu)

常見的with結(jié)構(gòu)是在進行文件操作時,比如

# 中規(guī)中矩的寫法
f = open("test.txt", "w")
f.write("hello world!")
f.close()
# 采用with結(jié)構(gòu)
with open("test.txt", "w") as f:
  f.write("hello world!")

這個結(jié)構(gòu)的好處,一個是簡潔,一個是當我們對文件操作的邏輯很長的時候,不會因為忘了關(guān)閉文件而造成不必要的錯誤。

類似的,當我們在某些時候不希望遺忘一些重要的語句的時候,可以自己封裝個with結(jié)構(gòu),比如關(guān)閉數(shù)據(jù)庫鏈接等情況。

一般實現(xiàn)方法

with結(jié)構(gòu)一般的實現(xiàn)方法是在定義類的時候重載__enter__方法和__exit__方法

比如我們可以通過如下代碼來模擬一下上面兩段代碼前者到后者的轉(zhuǎn)化

# -*- coding: utf-8 -*-
class myOpen():
    def __init__(self, name, state):
        self.f = open(name, state)
    # 返回值是with...as...中as出來的東西,如下面的f
    def __enter__(self):
        return self.f
    # 在with...as...語句塊自動執(zhí)行完之后執(zhí)行
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()
if __name__ == "__main__":
    with myOpen("test.txt", "w") as f:
        f.write("hello world!")

@contextmanager方法

好像上面這種方法實現(xiàn)起來with結(jié)構(gòu)有那么一點點麻煩,那么就進入主題吧,有一種逼格又高,又簡便的方法,先上代碼,仍以打開文件為例:

# -*- coding: utf-8 -*-
from contextlib import contextmanager
@contextmanager
def myOpen(name, state):
  try:
    f = open(name, state)
    yield f
  finally:
      f.close()
if __name__ == "__main__":
  with myOpen("test.txt", "w") as f:
      f.write("hello world!")

可以看出這里只要定義一個函數(shù),然后在它的頭部加上@contextmanager就好了

這個函數(shù)應(yīng)該怎么定義呢?我們?nèi)ピ创a里看一下就好,里面給出了詳細的注釋

def contextmanager(func):
    """@contextmanager decorator.
    Typical usage:
        @contextmanager
        def some_generator(<arguments>):
            <setup>
            try:
                yield <value>
            finally:
                <cleanup>
    This makes this:
        with some_generator(<arguments>) as <variable>:
            <body>
    equivalent to this:
        <setup>
        try:
            <variable> = <value>
            <body>
        finally:
            <cleanup>
    """
    @wraps(func)
    def helper(*args, **kwds):
        return GeneratorContextManager(func(*args, **kwds))
    return helper

通過注釋我們可以看到,我們可以通過給一個try…finally…結(jié)構(gòu)的函數(shù)頭部加上@contextmanager就可以通過with…as…結(jié)構(gòu)來調(diào)用它了

這樣try塊中yield的數(shù)據(jù)被as出來,finally塊中的數(shù)據(jù)在with..as..塊結(jié)束的時候被執(zhí)行。

到此這篇關(guān)于使用Python實現(xiàn)with結(jié)構(gòu)的@contextmanager方法詳解的文章就介紹到這了,更多相關(guān)Python實現(xiàn)with結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 在區(qū)塊鏈智能合約開發(fā)中的應(yīng)用與實踐小結(jié)

    Python 在區(qū)塊鏈智能合約開發(fā)中的應(yīng)用與實踐小結(jié)

    Python作為一種廣泛應(yīng)用的編程語言,在區(qū)塊鏈智能合約開發(fā)中扮演著重要角色,通過使用Python框架如Brownie和Web3.py,開發(fā)者可以輕松編寫和部署智能合約,感興趣的朋友一起看看吧
    2024-09-09
  • django和flask哪個值得研究學(xué)習(xí)

    django和flask哪個值得研究學(xué)習(xí)

    在本篇文章里小編給大家整理的是一篇關(guān)于django和flask哪個值得研究學(xué)習(xí)內(nèi)容,需要的朋友們可以參考下。
    2020-07-07
  • 解讀keras中的正則化(regularization)問題

    解讀keras中的正則化(regularization)問題

    這篇文章主要介紹了解讀keras中的正則化(regularization)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python實現(xiàn)rar解壓和壓縮的方法(附源碼)

    python實現(xiàn)rar解壓和壓縮的方法(附源碼)

    數(shù)據(jù)量現(xiàn)在越來越大,壓縮文件在日常生活中很常用,這篇文章主要給大家介紹了關(guān)于python實現(xiàn)rar解壓和壓縮的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Python2.7下安裝Scrapy框架步驟教程

    Python2.7下安裝Scrapy框架步驟教程

    本篇文章主要介紹了Python2.7下安裝Scrapy框架步驟教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Pycharm?cannot?set?up?a?python?SDK問題的原因及解決方法

    Pycharm?cannot?set?up?a?python?SDK問題的原因及解決方法

    這篇文章主要給大家介紹了關(guān)于Pycharm?cannot?set?up?a?python?SDK問題的原因及解決方法,這個問題已經(jīng)不是第一次出現(xiàn)了,所以干脆總結(jié)下,需要的朋友可以參考下
    2022-06-06
  • Python全棧之字符串和列表相關(guān)操作

    Python全棧之字符串和列表相關(guān)操作

    這篇文章主要為大家介紹了Python字符串和列表相關(guān)操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python基礎(chǔ)之字典的詳細使用教程

    Python基礎(chǔ)之字典的詳細使用教程

    字典作為Python的一個內(nèi)置數(shù)據(jù)結(jié)構(gòu),和列表一樣都是可變序列的,但是它是無序的,以鍵值對的方式存儲數(shù)據(jù)。本文將詳解一下Python中字典的使用,需要的可以參考一下
    2022-07-07
  • 在django模板中實現(xiàn)超鏈接配置

    在django模板中實現(xiàn)超鏈接配置

    今天小編就為大家分享一篇在django模板中實現(xiàn)超鏈接配置,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • tensor和numpy的互相轉(zhuǎn)換的實現(xiàn)示例

    tensor和numpy的互相轉(zhuǎn)換的實現(xiàn)示例

    這篇文章主要介紹了tensor和numpy的互相轉(zhuǎn)換的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

临泉县| 湖南省| 津南区| 海口市| 宣武区| 深水埗区| 中牟县| 南澳县| 商城县| 嘉鱼县| 永泰县| 灌云县| 中超| 平山县| 黔西县| 余江县| 高尔夫| 巴塘县| 东宁县| 罗平县| 裕民县| 阿城市| 米脂县| 尉氏县| 察雅县| 绍兴县| 公安县| 白水县| 湾仔区| 陇西县| 咸阳市| 临猗县| 长海县| 商都县| 正镶白旗| 武穴市| 虹口区| 毕节市| 色达县| 潮安县| 高淳县|