我有很多实例,每个实例都有一个唯一的临时文件供其使用(将数据从内存保存到磁盘并稍后检索它们)。
我想确保最终所有这些文件都被删除。然而,我想留出空间来对它们的删除进行细粒度的控制。也就是说,如果需要的话,某些文件可以提前删除(例如,它们太大并且不再重要)。
实现这一目标的最佳/推荐方法是什么?
可能对此有想法
块try-finalize或with语句不是一个选项,因为我们有许多文件,它们的生命周期可能会相互重叠。而且,它几乎不承认更精细控制的选择。
从我读到的内容来看,__del__这也不是一个可行的选择,因为它甚至不能保证它最终会运行(尽管我并不完全清楚什么是“有风险”的情况)。此外(如果仍然如此),__del__运行时库可能不可用。
tempfile图书馆似乎很有前途。然而,文件在关闭后就消失了,这绝对是一个遗憾,因为我希望它们被关闭(当它们不执行任何操作时)以限制打开文件的数量。
该库承诺该文件“一旦关闭(包括对象被垃圾收集时的隐式关闭)就会被销毁”。
他们如何实现隐式关闭?例如,在 C# 中,我会使用(可靠的)终结器,但事实__del__并非如此。
atexit库似乎是最好的候选者,它可以作为可靠的终结器,而不是__del__实现安全的一次性模式。与对象终结器相比,唯一的问题是它真正在退出时运行,这相当不方便(如果对象有资格更早地被垃圾收集怎么办?)。
在理想情况下,似乎__del__和atexit库的组合可能表现最好。也就是说,清理既在 at__del__又在 中注册的方法进行atexit,而禁止重复清理。如果__del__被调用,注册的将被删除。
唯一(但也很关键)的问题是,__del__如果在 处注册了方法,则该方法不会运行atexit,因为对该对象的引用永远存在。
因此,欢迎任何建议、建议、有用的链接等。
我想创建一个像这里一样的工厂方法。
class A:
...
class B(A):
def f(self):
...
class C:
...
def factory(cls):
return cls()
Run Code Online (Sandbox Code Playgroud)
但我想添加一些类型提示,有两个要求:
A允许 的子类作为 的参数factory。B传递时,正确检测到factory(B)是 的实例B,即。factory(B).f()允许,而factory(A).f()不允许。Type从模块中使用typing。
from typing import Type
class A:
...
class B(A):
def f(self):
...
class C:
...
def factory(cls: Type[A]):
return cls()
factory(A) # Ok
factory(B) # Ok
factory(C) # Fail
factory(A).f() # Fail
factory(B).f() # Fail -- Wrong!
Run Code Online (Sandbox Code Playgroud)
这个正确地检测到C …