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()
为什么导入的模块在 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 toNone
. […]
为了保持所需的全局数据有效,__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()