Python 的 datetime 模块在 del 方法中找不到

Python's datetime module is not found in del method

为什么导入的模块在 Python 析构函数(__del__ 方法)中不可用?可以通过某种方式提供吗?

例如,在解释器关闭期间调用 __del__ 时以下失败:

import datetime as datetime

class A:
    def __init__(self):
        self.start = datetime.now()
    def __del__(self):
        self.end = datetime.now()

a = A()

日期时间在构造函数中可用,而在调用析构函数时不可用。可能模块现在已经清理干净了,但是有什么方法可以确保日期时间仍然可用吗?

__del__ 终结器方法可以在特殊情况下调用,因此不应对其环境做出假设。具体来说,在解释器关闭期间,模块的全局命名空间被清除以打破引用循环——__del__ 因此不能依赖导入的模块可用。

object.__del__(self)

  • __del__() can be executed during interpreter shutdown. As a consequence, the global variables it needs to access (including other modules) may already have been deleted or set to None. […]

为了保持所需的全局数据有效,__del__ 应该将它们重新绑定为参数默认值。这意味着全局模块引用在方法 definition 上解析,然后保留为 local 默认值。只要函数本身存在,这种重新绑定的数据就会存在。

import datetime as datetime

class A:
    def __init__(self):
        self.start = datetime.now()
    # local reference vvvvvvvv vvvvvvvv global reference
    def __del__(self, datetime=datetime):
        self.end = datetime.now()