检查对象是否是Python2和Python3中的文件

检查对象是否是Python2和Python3中的文件,python,python-3.x,python-2.7,compatibility,Python,Python 3.x,Python 2.7,Compatibility,是否有一种与Python 2/3兼容的方法来检查对象是否是文件 我需要检查对象filehandler是否实际上是文件对象。这段代码需要同时在Python2和Python3中运行。在Python 2中,我可以 isinstance(filehandler, file) 但是,当使用Python3运行时,这段代码会引发一个NameError 根据,在Python3中,应该使用io.IOBase来检查对象是否是文件,但Python2的file没有子类io.IOBase,因此isinstance(fi

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

我需要检查对象
filehandler
是否实际上是
文件
对象。这段代码需要同时在Python2和Python3中运行。在Python 2中,我可以

isinstance(filehandler, file)
但是,当使用Python3运行时,这段代码会引发一个
NameError

根据,在Python3中,应该使用
io.IOBase
来检查对象是否是文件,但Python2的
file
没有子类
io.IOBase
,因此
isinstance(filehandler,io.IOBase)
不起作用

我曾考虑过使用
isinstance(filehandler,(io.IOBase,file))
,但当我使用Python3运行它时,仍然会出现
NameError


有没有一种方法可以同时兼容Python 2.7和3?

为什么不这样做呢

try:
    #check in py3
except:
    #check in py2

如果需要,可以添加一些其他错误处理程序,但这应该可以

我发现最常用的方法是在Python 3中检查
hasattr
。因此,我添加了一个检查来检查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))
或者,您可以使用
lambda
,但我发现它可读性较差

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

这就是我使用的解决方法:在
.py
文件的顶部,我添加了:

import sys

if sys.version_info[0] == 3:
    from io import IOBase
    file = IOBase
因此,如果使用的是Python 3,请将
文件
设置为
IOBase
。现在,
isinstance(filehandler,file)
将在Python3中正常工作,而在Python2中,它将一如既往地正常工作


当然,这个解决方案非常粗糙和混乱,因为它使它看起来像是
IOBase
file
的Python3版本,但事实并非如此。但是它确实解决了问题。

我相信你的意思是
除了名字错误:
而不是一条毛毯
除了:
对吗?是的,如果你相对确定你会得到什么,那可能会更安全。最好只抓住你知道你会得到的东西,而不是抓住一切。如果代码由于其他意外原因抛出了一个
ValueError
,那么我想除了之外的所有
都会导致难以调试的错误。这个代码块不会工作,因为使用Py3检查不会在Py2中引发错误,它只会给出错误的答案。Py2和Py3代码需要切换
lambda
的要点是它是一个未命名函数,因此如果需要命名函数,没有理由不使用
def
。更清晰、更可读的IOBase不能保证像文件一样的对象,例如参见
>>my_var=tempfile.NamedTemporaryFile()>>my_var>>>isinstance(z,io.IOBase)False