我想要一个函数返回一个文件对象,我可以用它将二进制数据写入标准输出。在python2中sys.stdout
就是这样一个对象。在python3中它是sys.stdout.buffer
。
检索此类对象的最优雅/首选方法是什么,以便它对python2和python3解释器都有效?
是检查sys.stdout.buffer
(可能使用inspect
模块)存在的最佳方法,如果存在,则返回它,如果不存在,则假设我们在python2上并返回{{1而不是?
答案 0 :(得分:10)
无需测试,只需使用getattr()
:
# retrieve stdout as a binary file object
output = getattr(sys.stdout, 'buffer', sys.stdout)
这将检索.buffer
上的sys.stdout
属性,但如果它不存在(Python 2),它将返回sys.stdout
对象本身。
Python 2:
>>> import sys
>>> getattr(sys.stdout, 'buffer', sys.stdout)
<open file '<stdout>', mode 'w' at 0x100254150>
Python 3:
>>> import sys
>>> getattr(sys.stdout, 'buffer', sys.stdout)
<_io.BufferedWriter name='<stdout>'>
考虑到在Python 2中,stdout
仍然在文本模式下打开,写入时换行仍然会转换为os.linesep
。 Python 3 BufferedWriter
对象不会为你做这件事。