我的 __del__() 可能会引发 ResourceWarning KeyboardInterrupt 会导致不必要的警告吗?

问题描述

以从python-3.9.0/Lib/asyncore.py复制的这个例子-

class file_wrapper:
    # Here we override just enough to make a file
    # look like a socket for the purposes of asyncore.
    # The passed fd is automatically os.dup()'d

    def __init__(self,fd):
        self.fd = os.dup(fd)

    def __del__(self):
        if self.fd >= 0:
            warnings.warn("unclosed file %r" % self,ResourceWarning,source=self)
        self.close()

    # ...

    def close(self):
        if self.fd < 0:
            return
        fd = self.fd
        self.fd = -1
        os.close(fd)

    # ...

ResourceWarning 的目的是在您的程序出现“泄漏”资源的错误时发出警告。让我们尝试编写一个没有任何此类错误的程序:

def test():
    f = None
    try:
        f = file_wrapper(sys.stdin.fileno)
        os.write(self.f.fd,b'!')
    finally:
        if f:
            f.close()

在 cpython 中,假设控制台中断发生在 CALL_FUNCTION 操作码之后和 STORE_FAST 操作码之前。

一个 file_wrapper 对象将存在(在堆栈上),但它不会绑定到变量 f

尽管我们的程序非常小心,但中断是否会触发我们的 ResourceWarning?

>>> import dis
>>> dis.dis(test)
  2           0 LOAD_CONST               0 (None)
              2 STORE_FAST               0 (f)

  3           4 SETUP_FINALLY           44 (to 50)

  4           6 LOAD_GLOBAL              0 (file_wrapper)
              8 LOAD_GLOBAL              1 (sys)
             10 LOAD_ATTR                2 (stdin)
             12 LOAD_ATTR                3 (fileno)
             14 CALL_FUNCTION            1
             16 STORE_FAST               0 (f)
...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)