检查对象是否是Python 2和3中的文件

jpy*_*ams 5 python compatibility python-2.7 python-3.x

是否有与Python 2/3兼容的方法来检查对象是否是文件?

我需要检查对象filehandler是否实际上是一个file对象.这段代码需要在Python 2和3中运行.在Python 2中,我可以做到

isinstance(filehandler, file)
Run Code Online (Sandbox Code Playgroud)

但是,file它不是Python 3的一部分,所以这个代码NameError在使用Python 3运行时会引发.

根据这个答案,在Python 3中io.IOBase应该用来检查一个对象是否是一个文件,但是Python 2 file不是子类io.IOBase,所以isinstance(filehandler, io.IOBase)不起作用.

我考虑过这样做isinstance(filehandler, (io.IOBase, file)),但是NameError当我用Python 3运行时,它仍然提供了.

有没有办法与Python 2.7和3兼容?

Nei*_*eil 2

我发现最常见的方法是检查hasattrPython 3。因此,我添加了一个检查来检查 Python 的版本,并根据该情况执行正确的函数。

import sys

def isFile(f):
    return isinstance(f,file) if sys.version_info[0] == 2 else hasattr(f, 'read')        

f = open("post.php","r")
print(isFile(f))
print(isFile(10))
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 a lambda,但我发现它的可读性较差。

isFile = lambda f:isinstance(f,file) if sys.version_info[0] == 2 else hasattr(f, 'read')   
Run Code Online (Sandbox Code Playgroud)