我正在使用 Python 开发一个小型业余项目。我希望“正确行事”,并遵循通用准则。
按照使用 SQLite 的示例包,我可以通过使用上下文使事情正常工作。
例子:
import mypackage as mp
with mp.democlass() as dc:
dc.dosomething('some_parameter')
这显然调用了__enter__
和__exit__
函数。
如果我希望打包我的作品,以便也可以在没有with
函数的情况下使用,例如:
dc = mp.democlass()
dc.dosomething('some_parameter')
.. 什么是“正确”的方法。我可以在类中确定它是否在with
上下文中使用,或者我是否需要编写一个相同的初始化函数__enter__
,例如打开数据库连接。
我希望这个问题有意义。也许我需要一个具有两种方式的样板模块。
即使在 Python 标准库中,也有相当多的类可以将上下文用作选项。(例如,
concurrent.futures
执行器,甚至是内置文件调用返回的对象open
)一般模式是直接在方法中创建所有需要的资源
__init__
,而__enter__
方法本质上成为“无操作”,其主体通常只有一行return self
。在这些情况下,无论需要执行什么资源清理(例如,提交事务),都可以在公共方法(可以命名为
close
或commit
)中完成 - 并且该__exit__
方法将从其主体中调用该方法。__del__
如果对象只是在“快乐路径”中取消引用,则将以确定性方式调用类中的方法 - 但它实际上永远不会在边缘情况下运行,例如,当发生异常并且解释器退出时。所有文档(以及我自己的亲身经历)都一致不建议将重要的清理操作仅作为__del__
方法的一部分添加(顺便说一句,方法内部引发的异常__del__
会被吞噬,甚至不会打印出来)这样,人们可以自由地在
with
上下文管理器块之外使用资源,但在这样做时,要负责确保调用清理方法。