【问题标题】:Python's datetime module is not found in del method在 del 方法中找不到 Python 的 datetime 模块
【发布时间】:2021-11-10 13:19:41
【问题描述】:

为什么导入的模块在 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()

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

【问题讨论】:

  • 失败的代码在哪里?
  • @NielGodfreyPonciano 现已添加。
  • 是的,但是有没有办法可以创建对 datetime 模块的引用,它不会让 datetime 被清理?

标签: python python-3.x destructor


【解决方案1】:

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

object.__del__(self)

  • __del__() 可以在解释器关闭期间执行。因此,它需要访问的全局变量(包括其他模块)可能已经被删除或设置为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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2021-09-10
    相关资源
    最近更新 更多