QFile.open() 在上下文管理方面是否表现得像 Python 的 open()?

Does QFile.open() behave like Python's with open() in terms of context management?

Qt4.8 文档(如 here 所述)建议 QtCore.QFile-对象在销毁时关闭其文件(如果文件打开)。

这是否意味着这个 PyQt4 片段

my_file = QtCore.QFile('some_file.bin')
my_file.open(QtCore.QFile.ReadOnly)
... do stuff that might raise an exception ...

类似于此非 PyQt 片段,它使用 open() 作为上下文管理器?

with open('some_file.bin', 'rb') as my_file:
   ... do stuff that might raise an exception ...

也就是说,当出现问题并且程序退出时文件会自动关闭(如讨论的那样 here)。

没有。如果发生错误,QFile 不会自动关闭。事实上,也不会有例外。 Qt 根本不处理异常,因此您需要检查 return 值并改为查询 error() 方法。

这是一些示例输出:

>>> f = QtCore.QFile('/tmp/test.txt')
>>> f.open(QtCore.QIODevice.ReadWrite)
True
>>> f.resize(10)
True

请注意 Qt 如何在此处 returns True/False,而 Python 会在出现问题时引发 OSError/IOError

>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True

此处需要进行显式检查以确保读取时没有发生错误。

>>> f.close()
>>> f.open(QtCore.QIODevice.ReadOnly)
True
>>> f.resize(20)
False
>>> f.error() == QtCore.QFile.ResizeError
True

所以现在出现了错误 - 但没有引发异常,并且文件仍然打开且可读:

>>> f.isOpen()
True
>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True

删除QFile会自动关闭;但除此之外,您将需要明确关闭它以释放资源 - 即使在其生命周期内发生错误。