关于io.FileIO(RawIOBase)类__init__构造函数的疑问及测试异常
关于io.FileIO的两个疑问解答
一、构造函数中if self._fd >=0判断的作用
这个判断和传入的file参数类型无关,它是用来处理实例已关联文件描述符的场景:
_fd是FileIO实例的属性,类定义里的_fd = -1是默认初始值,每个实例初始化时会继承这个值。但如果实例被重复初始化(比如子类多次调用父类__init__),或者有人手动修改过实例的_fd为有效文件描述符时,这个判断会先关闭已打开的文件描述符,再重置为-1,避免资源泄漏。- 无论传入的
file是路径字符串/字节还是整数文件描述符,这个逻辑都是为了保证实例在初始化前没有残留的已打开文件资源。
对应的核心代码片段:
class FileIO(RawIOBase): _fd = -1 _created = False _readable = False _writable = False _appending = False _seekable = None _closefd = True def __init__(self, file, mode='r', closefd=True, opener=None): if self._fd >= 0: # 先关闭已存在的文件 try: if self._closefd: os.close(self._fd) finally: self._fd = -1
二、为何已存在文件未触发FileExistsError
文档里提到的"opened for creating"特指独占创建模式,也就是模式参数中包含x的情况(比如'xb',二进制独占创建):
- 当使用
mode='xb'时,如果文件已存在,才会触发FileExistsError; - 而普通的写模式(比如
'wb')只会截断已存在的文件内容,不会触发错误,这是符合POSIX文件操作规范的行为。
文档原文引用:
"The file will be created if it doesn't exist when opened for writing or appending; it will be truncated when opened for writing. A FileExistsError will be raised if it already exists when opened for creating"
这里的"opened for creating"明确对应带x的独占创建模式,而非普通写模式。
内容的提问来源于stack exchange,提问作者VIJITH KUMAR
相关产品推荐
相关产品推荐

