首页 > 编程语言 >Python进阶-上下文管理器

Python进阶-上下文管理器

时间:2023-06-20 12:35:16浏览次数:71  
标签:__ 管理器 进阶 Python self instance return def exc

上下文管理器

定义

  • 包装任意代码
  • 确保执行的一致性

语法

  • with语句
  • __enter__和__exit__方法
class ContextManager(object):
    def __init__(self):
        self.entered = False
        
    def __enter__(self):
        self.entered = True
        return self
        
    def __exit__(self, exc_type, exc_instance, traceback):
        self.entered = False

应用场景

资源清理

import pymysql

class DBConnection(object):
    def __init__(self, *args, **kwargs):
        self.args,self.kwargs = args, kwargs
        
    def __enter__(self):
        self.conn = pymysql.connect(*args, **kwargs)
        return self.conn.cursor()
        
    def __exit__(self, exc_type, exc_instance, trackback):
        self.conn.close()

异常处理(避免重复)

  • 传播异常(__exit__中return False)
  • 终止异常(__exit__中return True)
class BubleExceptions(object):
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_instance, trackback):
        if exc_instance:
            print("出现异常: {}".format(exc_instance)
        return False   # return True终止异常
  • 处理特定的异常
class HandleValueError(object):
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_instance, trackback):
        if not exc_type: return True
        if issubclass(exc_type, ValueError): 
            print("处理ValueError: {}".format(exc_instance)
        return False

if issubclass...语句改为if exec_type == ValueError则不处理ValueType的子类异常

也可以根据异常的属性来判断是否传播或终止

更简单的语法

import contextlib

@contextlib.contextmanager
def acceptable_error_codes(*codes):
    try:
        yield
    except ShellException as exc_instance:
        if exc_instance.code not in codes:
            raise
        pass

标签:__,管理器,进阶,Python,self,instance,return,def,exc
From: https://www.cnblogs.com/superhin/p/17493323.html

相关文章

  • [python][图像切割]给定手写数字图片完成数字切割
    importtorchimporttorch.nnasnnfromtorchvisionimporttransformsfromPILimportImage,ImageOpsimportnumpyasnpimg=Image.open("QQ.png")imgdefCutImage(img):img=img.convert("L")threshold=128img=img.point(......
  • 【Fidder网络抓包+Python爬虫】下载微信小程序视频
    首先声明本篇博客以学习为目的,侵权即删。文章目录1.Fidder抓包1.1在电脑上打开微信小程序视频播放页以及Fidder软件1.2点击视频播放按钮,并查看Fidder抓到的数据包2.Python爬虫2.1视频下载2.2视频合并2.3完整代码3.写在最后1.Fidder抓包       关于fidder软件的安......
  • Python中获取路径/文件的父目录
    本教程将讲解在Python中获取一个路径的父目录的各种方法。父目录是指高于或高于给定目录或文件的目录。例如,路径 C:\folder\subfolder\myfile.txt 的父目录是 C:\folder\subfolder。除了根目录外,每个目录都有一个父目录。1、使用 pathlib 模块的 path.parent() 方法获......
  • lazy-nvim插件管理器基础入门
    一篇通过使用lazy.nvim进行nvim插件管理的入门笔记。基础安装init.lua路径:stdpath("config")/init.luastdpath("config")macOS/Linux:~/.config/nvimWindows:~/AppData/Local/nvim--bootstraplazy.nvim--./lua/lazynvim-init.luarequire("lazynvim-init"......
  • wxpython使用matplotlib.pyplot绘制GUI嵌入式统计图
    在使用wxpython编写GUI时,如果需要在GUI上显示统计图,这里就可以用到matplotlib.pyplot;一、首先就是导入matplotlib.pyplot模块frommatplotlib.backends.backend_wxaggimportFigureCanvasWxAggasFigureCanvasimportmatplotlib.pyplotasplt然后就需要一个容器,可以理......
  • Python中的字符串分割技巧:split方法的妙用
    Python是一种广泛使用的编程语言,提供了许多强大的字符串处理功能。其中,split方法是一项常用的技术,它可以将字符串按照指定的分隔符进行切割,使得处理文本数据变得更加简洁和高效。本文将介绍split方法的使用方法和几个实用的应用场景,帮助读者更好地掌握这一技巧。split方法的基本......
  • python爬虫学习之定制请求头
    1.在Chrome浏览器中点击右键选择“检查”命令;2.打开后选择Network;3.按下ctrl+r,在其中找到需要请求的网站,单击后选择Headers;4.得到请求头信息为:Host:www.baidu.comReferer:https://www.baidu.com/?tn=98012088_2_dg&ch=7User-Agent:Mozilla/5.0(WindowsNT10.0;WOW64)A......
  • Python学习总结之三(if语句)
    1.其实Python和C语言中的if语句是极相似的,因为if语句的职能便是判断,区别如下:(1).Python(无括号,有冒号且缩进):ifcar=='byd':print(car.upper())(2).C(有括号,无冒号且缩进无意义):if(car=="byd")printf("%s",car);2.检查是否不相等:将“==”换为"!="即可。3.比较数字......
  • 自学Python的第三天,小结一下
               作为一名计算机专业大一学生,C语言课程的学习在上半学期已然结束,一直想找个时间再开一门语言来学习,和大多数人一样因为当下python比较火也比较实用,所以就选择了这门语言。           就简单谈谈我在这两天空余时间学到的一些东西以及我的体会。首......
  • python第二次小结(章四)
    由于最近数学建模校赛即将到来,所以一直忙着磨合队内配合,因此对python的学习其实是有一点点落下了,今天抽一点时间来写这篇第四章小结。在我看来整个第四章的核心应该在for语句循环遍历。1.首先是对for语句的使用(勿忘:冒号及缩进):eg:names=['ldl','cql','xhx'] fornameinnames......