问题 为什么open(True,'w')打印像sys.stdout.write这样的文本?


我有以下代码:

with open(True, 'w') as f:
    f.write('Hello')

为什么此代码会打印文本 Hello 而不是引发错误?


2066
2017-09-29 09:59


起源



答案:


来自 内置函数文档 open()

open(file, mode='r', buffering=-1... 文件 是一个字符串或字节对象,给出要打开的文件的路径名(绝对或相对于当前工作目录)或要包装的文件的整数文件描述符

该“整数文件描述符”在进一步描述 os 模块文档

例如,标准输入通常是文件描述符0,标准输出是1,标准错误是2.然后,进程打开的其他文件将分配3,4,5等。

因为布尔是一个 int 子类, False 可以互换使用 0 和 True 同 1。因此,打开一个文件描述符 True 与打开文件描述符相同 1,这将选择标准输出。


10
2017-09-29 10:06



那怎么样? 0? :) - Kevin Guan
这是否意味着当你打开一个文件时,它会是 3, 4, 5等等? - Kevin Guan
正如它在第二个引用块中所说的, 0 是标准输入,随着打开更多文件,将分配顺序整数。 - TigerhawkT3
@KevinGuan,除非你打开文件描述符,其fileno为3,4或5,否则它显然不起作用。它只适用于0,1或2,因为它们是stdin,stdout和stderr,它们是打开的文件描述符。 - Padraic Cunningham
@PadraicCunningham,TigerhawkT3现在明白了,谢谢:) - Kevin Guan


答案:


来自 内置函数文档 open()

open(file, mode='r', buffering=-1... 文件 是一个字符串或字节对象,给出要打开的文件的路径名(绝对或相对于当前工作目录)或要包装的文件的整数文件描述符

该“整数文件描述符”在进一步描述 os 模块文档

例如,标准输入通常是文件描述符0,标准输出是1,标准错误是2.然后,进程打开的其他文件将分配3,4,5等。

因为布尔是一个 int 子类, False 可以互换使用 0 和 True 同 1。因此,打开一个文件描述符 True 与打开文件描述符相同 1,这将选择标准输出。


10
2017-09-29 10:06



那怎么样? 0? :) - Kevin Guan
这是否意味着当你打开一个文件时,它会是 3, 4, 5等等? - Kevin Guan
正如它在第二个引用块中所说的, 0 是标准输入,随着打开更多文件,将分配顺序整数。 - TigerhawkT3
@KevinGuan,除非你打开文件描述符,其fileno为3,4或5,否则它显然不起作用。它只适用于0,1或2,因为它们是stdin,stdout和stderr,它们是打开的文件描述符。 - Padraic Cunningham
@PadraicCunningham,TigerhawkT3现在明白了,谢谢:) - Kevin Guan