m4t*_*4tx 1 python cpython internals
请考虑以下脚本:
import sys
class A:
def __init__(self):
print('Constructing A')
print(sys.argv)
print(sys.meta_path)
print(sys.float_info)
def __del__(self):
print('Destructing A')
print(sys.argv)
print(sys.meta_path)
print(sys.float_info)
x = A()
Run Code Online (Sandbox Code Playgroud)
我期望从运行这个代码将打印相同sys.argv的__init__()和__del__()阶级的A。但是,输出与预期不同:
Constructing A
['test.py']
[<class '_frozen_importlib.BuiltinImporter'>, ...]
sys.float_info(max=1.7976931348623157e+308, ...)
Destructing A
None
None
sys.float_info(max=1.7976931348623157e+308, ...)
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么会这样?它是一个实现细节CPython的设置sys.argv,以None在关机,或者是它的文档中描述的地方?为什么 Python(显式地或通过 GC)首先从sys(likeargv或meta_path) 中删除一些对象,同时保留其他对象 (like float_info)?
我在 GNU/Linux 上使用 CPython 3.8.5。
在__del__解释器关闭期间发生的s 期间,解释器状态的所有保证或多或少都关闭。
我有根据的猜测是模块和对象以任意顺序被清理。如果您想深入研究,Py_FinalizeEx(void)这里似乎是调用所有其他函数的相关函数。
(__del__无论如何你不应该依赖确定性清理;例如,用户可能有gc.disable()d 并且你的函数永远不会被调用。相反,使用上下文管理器。)