手动调用 __enter__ 和 __exit__

2024-03-14

我用谷歌搜索过但没有运气。所以让我们想象一下我有MySQL使用的连接器类__enter__ and __exit__函数(最初与with语句)来连接/断开与数据库的连接。

让我们有一个使用其中 2 个连接的类(例如用于数据同步)。注意:这不是我的现实生活场景,但这似乎是最简单的例子.

使其协同工作的最简单方法是这样的类:

class DataSync(object):

    def __init__(self):
        self.master_connection = MySQLConnection(param_set_1)
        self.slave_connection = MySQLConnection(param_set_2)

    def __enter__(self):
            self.master_connection.__enter__()
            self.slave_connection.__enter__()
            return self

    def __exit__(self, exc_type, exc, traceback):
            self.master_connection.__exit__(exc_type, exc, traceback)
            self.slave_connection.__exit__(exc_type, exc, traceback)

    # Some real operation functions

# Simple usage example
with DataSync() as sync:
    records = sync.master_connection.fetch_records()
    sync.slave_connection.push_records(records)

Q: 可以打电话吗(有什么问题吗)__enter__/__exit__像这样手动?

Pylint 1.1.0 没有对此发出任何警告,我也没有找到任何关于它的文章(开头的谷歌链接)。

那么调用呢:

try:
    # Db query
except MySQL.ServerDisconnectedException:
    self.master_connection.__exit__(None, None, None)
    self.master_connection.__enter__()
    # Retry

这是一个好/坏的做法吗?为什么?


你的第一个例子不是一个好主意:

  1. 如果发生什么情况slave_connection.__enter__抛出异常:

    • master_connection获取其资源
    • slave_connection fails
    • DataSync.__enter__传播异常
    • DataSync.__exit__不运行
    • master_connection永远不会被清理干净!
    • 潜在的坏事
  2. 如果发生什么情况master_connection.__exit__抛出异常?

    • DataSync.__exit__提前完成
    • slave_connection永远不会被清理干净!
    • 潜在的坏事

contextlib.ExitStack可以在这里提供帮助:

def __enter__(self):
    with ExitStack() as stack:
        stack.enter_context(self.master_connection)
        stack.enter_context(self.slave_connection)
        self._stack = stack.pop_all()
    return self

def __exit__(self, exc_type, exc, traceback):
    self._stack.__exit__(self, exc_type, exc, traceback)

问同样的问题:

  1. 如果发生什么情况slave_connection.__enter__抛出异常:

    • 退出 with 块,并且stack清理master_connection
    • 一切都好!
  2. 如果发生什么情况master_connection.__exit__抛出异常?

    • 没关系,slave_connection在调用之前被清理
    • 一切都好!
  3. 好的,如果会发生什么slave_connection.__exit__抛出异常?

    • ExitStack确保致电master_connection.__exit__无论从属连接发生什么情况
    • 一切都好!

打电话没有什么问题__enter__直接调用它,但如果您需要在多个对象上调用它,请确保正确清理!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手动调用 __enter__ 和 __exit__ 的相关文章

  • 如何在 Google App Engine 的 Python 中获取 StringProperty 的值?

    如何获取 nbd Model 的值 我想返回由多个字段组成的描述 但我无法让它工作 这是我的班级代码 class User ndb Model name ndb StringProperty email ndb StringProperty
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • Python GTK + webkit - 在 gtk.main() 之后插入 JavaScript

    我在终端中尝试了这个 一切正常 但是如果我在脚本内运行这个 我无法在 gtk main 之后插入 JavaScript import gtk import webkit w gtk Window b webkit WebView w add
  • 最小二乘法拟合直线 python 代码

    我有一个由 X 和 Y 坐标组成的散点图 我想使用直线的最小二乘拟合来获得最佳拟合线 直线最小二乘拟合是指 如果 x 1 y 1 x n y n 是测量数据对 则最佳直线是y A Bx 这是我的Python代码 number of poin
  • 组和平均 NumPy 矩阵

    假设我有一个任意的 numpy 矩阵 如下所示 arr 6 0 12 0 1 0 7 0 9 0 1 0 8 0 7 0 1 0 4 0 3 0 2 0 6 0 1 0 2 0 2 0 5 0 2 0 9 0 4 0 3 0 2 0 1 0
  • Tipfy:如何在模板中显示blob?

    鉴于在 gae 上使用tipfy http www tipfy org python 以下模型 greeting avatar db Blob avatar 显示 blob 此处为图像 的模板标签是什么 在这种情况下 斑点是一个图像 这很棒
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 按多个键分组并对字典列表的值进行汇总/平均值

    在Python中按多个键进行分组并对字典列表进行汇总 平均值的最Pythonic方法是什么 假设我有一个字典列表 如下所示 input dept 001 sku foo transId uniqueId1 qty 100 dept 001
  • 如何使用 PyMongo 在重复键错误后继续插入

    如果我需要在 MongoDB 中插入尚不存在的文档 db stock update one document set document upsert True 将完成这项工作 如果我错了 请随时纠正我 但是 如果我有一个文档列表并想将它们全
  • 在谷歌云上训练神经网络时出现“无法获取路径的文件系统”错误

    我正在使用 Google Cloud 在云上训练神经网络 如下例所示 https cloud google com blog big data 2016 12 how to classify images with tensorflow u
  • Pandas groupby apply 执行缓慢

    我正在开发一个涉及大量数据的程序 我正在使用 python pandas 模块来查找数据中的错误 这通常工作得非常快 然而 我当前编写的这段代码似乎比应有的速度慢得多 我正在寻找一种方法来加快速度 为了让你们正确测试它 我上传了一段相当大的
  • PyArmor - 打包为一个可执行文件

    当我执行此命令时 您好 使用 PyArmor pyarmor pack main py 它将它打包到一个名为的文件夹中dist里面包含我的 exe 以及许多 Python 扩展文件 据我所知 PyArmor 使用 PyInstaller 来
  • 在 matplotlib 中绘制多边形的并集[重复]

    这个问题在这里已经有答案了 我正在尝试绘制几个多边形的并集matplotlib 具有一定的 alpha 水平 我当前的代码在交叉点处颜色较深 有没有办法让交叉路口与其他地方的颜色相同 import matplotlib pyplot as
  • python dicttoxml 多次使用相同的键

    我正在尝试做如下所示的 xml
  • 在 Python 中访问 argparse 的参数值

    我正在尝试为我的程序设置一些简单的标志参数 但无法弄清楚如何访问它们 我有 argparser parser argparse ArgumentParser description Simple PostScript Interpreter
  • Python:无法使用 os.system() 打开文件

    我正在编写一个使用该应用程序的 Python 脚本pdftk http www pdflabs com tools pdftk the pdf toolkit 几次来执行某些操作 例如 我可以在 Windows 命令行 shell 中使用
  • 如何更改matplotlib中双头注释的头大小?

    Below figure shows the plot of which arrow head is very small 我尝试了下面的代码 但它不起作用 它说 引发 AttributeError 未知属性 s k 属性错误 未知属性头宽
  • 如何从 nltk 下载器中删除数据/模型?

    我在 python3 NLTK 中安装了一些 NLTK 包 通过nltk download 尝试过它们 但不需要它们 现在想删除它们 我怎样才能删除例如包large grammars来自我的 NLTK 安装 我不想删除完整的 NLTK 安装
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code

随机推荐

  • 在 ANTLR 3 中,如何在运行时而不是提前生成词法分析器(和解析器)?

    我想在运行时生成 antlr 词法分析器 也就是说 生成语法并从语法生成词法分析器类及其在运行时的支持位 我很高兴将它输入到 java 编译器中 它可以在运行时访问 这是一种快速但肮脏的方法 生成一个combined ANTLR 语法 g给
  • 与单进程场景​​相比,多进程场景中的访问时间意外缩短

    我正在从program1访问共享库 共享数组数据结构 并找到读取该数组的所有元素的访问时间 当只有 Program1 单独执行时 我得到了大约 17000 个时钟周期 现在 当我首先在另一个选项卡中执行program2 具有空的while循
  • 使用 Travis-CI 推送 Git 存储库

    我想每次推送到主服务器时都执行一个脚本 该脚本将创建一些我想要提交和推送的文件 Travis 构建的日志似乎正在添加文件 提交和推送 但没有任何反应 我的 travis yml 是这样的 before install openssl aes
  • 通过交集和并集组合 NSArray

    我有两个 NSArrays A 和 B 它们共享一些共同的元素 例如 A 1 2 3 4 5 B 4 5 6 7 我想创建一个新的 NSArray 其中包含两个 NSArray 之间常见的内容 并与第二个 NSArray 的内容相连接 同时
  • 如何在.net core 2启动时访问IConfigurationRoot?

    我写了一个自定义ConfigurationProvider与实体框架 因为我还想让它在运行时可更新 所以我创建了一个IWritableableOption https stackoverflow com a 42705862 2441442
  • 批处理文件双击可以正常运行,但无法在 Windows 计划任务中运行

    我的 C 驱动器上有一个 archive pst 文件 我在 Outlook 中使用它来备份我的电子邮件 但我的C 不是每晚都备份的 因此 我想将 pst 文件复制到我的网络驱动器 以便持续备份 出于多种原因 我不希望 Outlook 直接
  • 为什么用于标点符号的 R gsub (或 regexp)不能获取所有标点符号?

    我正在清理基于文本的数据文件 但无法弄清楚为什么gsub punct X1 没有给出所有标点符号的匹配 不幸的是 我无法在这里复制这个问题 这让我认为这是一个字符编码问题 有问题的标点符号的外观与标准 ASCII 明显不同 这是我读入文件后
  • 在 Python 中生成一周中的日期?

    我需要从一个日期生成一周的星期一的日期 例如 2015 10 22 并生成接下来几天的日期 星期一 星期二 星期三 星期四 星期五 星期六 星期日 Java 示例 初始日期 2015 10 22 周一 date set Calendar D
  • 在 Spring Security 中传播 AccessDeniedException

    在我的 Web 应用程序中 我使用 Spring Security 和 Spring MVC 我已经使用了几种方法 Secured注释并以这样一种方式配置 Spring Security 当没有适当角色的情况下访问其中一个方法时 用户将被带
  • 获取 magento 商店列表

    如何获取 Magento 网站下的商店组列表 然后获取该商店组中的商店列表 尝试这样直接获取对象 Mage app gt getWebsites lt in file gt app code core Mage Core Model App
  • iOS 5、xcode 4.2、故事板中的主页按钮

    iOS 5 0 代码 4 2 我正在做一份多步骤调查问卷 每个分支大约有10个问题 并且还有子分支 但逻辑是相当线性的 大多数是 否答案 但也有一些多选选项 调查问卷将得出结论页 在此结论页面上 我想要一个显示 HOME 的按钮 这会将用户
  • 作为本地化字符串的字符串常量

    我想本地化我的常量 常量按通常的方式定义和声明 extern NSString const kStringName NSString const kStringName Whatever 如何使其可本地化 这根本行不通 NString co
  • NOCHECK 不禁用外键引用

    表创建脚本 CREATE TABLE dbo details id int NULL details varchar max NULL CREATE TABLE dbo name id int IDENTITY 1 1 NOT FOR RE
  • 如何自动更新 Subversion 工作副本?

    有谁知道我如何自动运行svn update 如果有人有脚本或类似的东西 你能给我举个例子吗 我正在使用 TortoiseSVN 在生产服务器上 我有一个运行以下批处理文件的计划任务 CD C Program Files TortoiseSV
  • 如何查看 Git 存储中未跟踪的文件

    我经常将我完成的工作隐藏在新的 未跟踪的 文件中 并且我希望以后能够找到这项工作 找到它的明显方法似乎是git show 我刚刚发现Git在我使用时完全省略了这些文件git show 但幸运的是 在弹出隐藏代码时不会忽略它们 这使得似乎不可
  • 在 FFmpeg 中正确分配和填充帧

    我正在填写一个Frame使用 BGR 图像进行编码 但出现内存泄漏 我想我找到了问题的根源 但它似乎是一个库问题 由于 FFmpeg 是一个如此成熟的库 我认为我误用了它 我希望得到指导如何正确地使用它 我正在分配一个Frame using
  • JasperReports 中的印地语字体 [重复]

    这个问题在这里已经有答案了 在印地语字体的内部预览中正确显示 但在 PDF 中情况有所不同 例如 在 Pdf 中显示 怎么解决这个问题 一些字体类型 例如 Arial Unicode MS 将支持特殊字符 例如印地语符号 要解决此问题 请打
  • 如何使用汇编程序从英特尔处理器中获取随机数?

    我需要从处理器 英特尔酷睿 i3 中的英特尔随机生成器获取随机数 我不想使用任何图书馆 我想在 C 中使用汇编程序粘贴 但我不知道应该使用哪些寄存器和指令 呼叫RDRAND支持的 CPU 目前仅 Ivy Bridge 和 Haswell I
  • 如何使用OpenCV找出帧之间的差异?

    在 OpenCV 上运行视频时如何找到帧之间的差异 我需要做一个循环来检查帧与帧之间的更改并将结果显示在另一个窗口中 我可以在此处附加的循环中执行此操作吗 或者还有其他方法可以做到吗 while key x frame cvQueryFra
  • 手动调用 __enter__ 和 __exit__

    我用谷歌搜索过但没有运气 所以让我们想象一下我有MySQL使用的连接器类 enter and exit 函数 最初与with语句 来连接 断开与数据库的连接 让我们有一个使用其中 2 个连接的类 例如用于数据同步 注意 这不是我的现实生活场