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