为什么在Python中退出时sys.argv设置为None?

2024-10-01 07:36:49 发布

您现在位置:Python中文网/ 问答频道 /正文

请考虑以下脚本:

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()

运行这段代码所期望的是在类__init__()__del__()中打印相同的sys.argv。但是,输出与预期不同:

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, ...)

我的问题:为什么会这样?CPython在关机时将sys.argv设置为None是一个实现细节,还是在文档中的某个地方进行了描述?为什么Python(显式地或通过GC)首先从sys(如argvmeta_path)删除一些对象,而保留其他对象(如float_info

我正在GNU/Linux上使用CPython 3.8.5


Tags: pathselfinfononeinitdefsysfloat
1条回答
网友
1楼 · 发布于 2024-10-01 07:36:49

在解释器关闭期间发生的__del__期间,解释器状态的所有保证或多或少都处于关闭状态

我有根据地猜测,模块和对象正在以任意顺序被清理。如果您想深入研究,^{} here似乎是调用所有其余函数的相关函数

(无论如何,您不应该依赖__del__进行确定性清理;例如,用户可能有gc.disable()d,并且您的函数永远不会被调用。相反,请使用上下文管理器。)

相关问题 更多 >