python - 为什么我得到 "NameError: global name ' open' is

我在类的 __del__ 函数中遇到 NameError。我不明白为什么在函数 __del__ 中无法访问“open”。我正在使用 Python 3.4.0

Python 代码:

class Contoller:

    ...

    def __del__(self):
        store = {}
        ...
        pickle.dump(store, open('data.p', 'wb'))    

class MyWindow(Gtk.Window):

    def __init__(self):
        ...
        self.controller = Contoller(self)
        ...
        self.connect("delete-event", self.quit)
        ...

    ...

    def quit(self, widget, event):
        del self.controller
        Gtk.main_quit()

错误信息:

Traceback (most recent call last):
  File "main.py", line 69, in __del__
NameError: name 'open' is not defined

最佳答案

user3595184 的代码在 Python 3.4 之前一直有效。我知道是因为我刚刚遇到了同样的问题,在 __del__ 中调用了 open()。显然,内置函数不再有效,因为在解释器关闭时运行 __del__ 的时间发生了变化。

更新: 参见 https://docs.python.org/3/library/weakref.html ,尤其是关于终结器的部分。我有几个类封装了对资源的访问,这些资源具有 __del__() 方法,可以在应用程序出于任何原因退出时立即解锁或清理。在应用程序级别捕获所有异常或退出并显式调用清理方法既不方便又容易出错。我将尝试使用本地 finalizer

更新: 我在 __enter__()__exit__() 方面运气更好,将顶级对象放在 with 子句中。看起来至少 __exit__() 无论如何都会被调用,所以我可以调用所有从属对象的清理方法(__exit__() 本身)。这对我有用。

关于python - 为什么我得到 "NameError: global name ' open' is not defined"in __del__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61038174/

相关文章:

javascript - 使用 Javascript 在带有自定义磁贴的新浏览器选项卡中打开 PDF

node.js - 如何修复 Brain.js 中的 NaN 训练错误?

xamarin.forms - System.Net.WebException : Error: T

python - 在 Django Channels 上找不到路径

go - 在 Ubuntu 18.04 的 $ANDROID_HOME/ndk-bundle 和 $

javascript - 使用 Jest/Enzyme 在 React 中的功能组件内部测试方法

laravel - 在 laravel-passport-social-grant 包上获取 inv

java - 如何使用 lsp-java 在 emacs 上打开一个 maven 项目?

entity-framework - System.Data.Entity 不可用

python - Pygame,声音不播放