小编Tom*_*ons的帖子

Python 中的正确终结

我有很多实例,每个实例都有一个唯一的临时文件供其使用(将数据从内存保存到磁盘并稍后检索它们)。

我想确保最终所有这些文件都被删除。然而,我想留出空间来对它们的删除进行细粒度的控制。也就是说,如果需要的话,某些文件可以提前删除(例如,它们太大并且不再重要)。

实现这一目标的最佳/推荐方法是什么?

可能对此有想法

  • try-finalizewith语句不是一个选项,因为我们有许多文件,它们的生命周期可能会相互重叠。而且,它几乎不承认更精细控制的选择。

  • 从我读到的内容来看,__del__这也不是一个可行的选择,因为它甚至不能保证它最终会运行(尽管我并不完全清楚什么是“有风险”的情况)。此外(如果仍然如此),__del__运行时库可能不可用。

  • tempfile图书馆似乎很有前途。然而,文件在关闭后就消失了,这绝对是一个遗憾,因为我希望它们被关闭(当它们不执行任何操作时)以限制打开文件的数量。

    • 该库承诺该文件“一旦关闭(包括对象被垃圾收集时的隐式关闭)就会被销毁”。

      他们如何实现隐式关闭?例如,在 C# 中,我会使用(可靠的)终结器,但事实__del__并非如此。

  • atexit似乎是最好的候选者,它可以作为可靠的终结器,而不是__del__实现安全的一次性模式。与对象终结器相比,唯一的问题是它真正在退出时运行,这相当不方便(如果对象有资格更早地被垃圾收集怎么办?)。

    • 在这里,问题仍然存在。库如何实现方法始终运行?(除非在非常意外的情况下很难做任何事情)

在理想情况下,似乎__del__atexit库的组合可能表现最好。也就是说,清理既在 at__del__又在 中注册的方法进行atexit,而禁止重复清理。如果__del__被调用,注册的将被删除。

唯一(但也很关键)的问题是,__del__如果在 处注册了方法,则该方法不会运行atexit,因为对该对象的引用永远存在。

因此,欢迎任何建议、建议、有用的链接等。

python garbage-collection finalizer temporary-files del

7
推荐指数
1
解决办法
6212
查看次数

Python 中的受限泛型类型提示

我想创建一个像这里一样的工厂方法。

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()不允许。

尝试1

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 …

python typing type-hinting

2
推荐指数
1
解决办法
2144
查看次数