是否有与Python 2/3兼容的方法来检查对象是否是文件?
我需要检查对象filehandler
是否实际上是一个file
对象。这段代码需要在Python 2和3中运行。在Python 2中,我可以做到
isinstance(filehandler, file)
然而file
is not part of Python 3,所以这个代码在使用Python 3运行时引发了NameError
。
根据this answer,在Python 3中,io.IOBase
应该用来检查一个对象是否是一个文件,但是Python 2的file
不是io.IOBase
的子类,所以isinstance(filehandler, io.IOBase)
将不起作用。
我考虑过做isinstance(filehandler, (io.IOBase, file))
,但是当我用Python 3运行它时仍然会给出NameError
。
有没有办法与Python 2.7和3兼容?
我发现最常见的方法是在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,请将file
设置为IOBase
。现在isinstance(filehandler, file)
将在Python 3中正常工作,而对于Python 2,它将像往常一样工作。
当然,这个解决方案是非常hackish和混乱,因为它使它看起来像IOBase
是file
的Python 3版本,但事实并非如此。但它确实解决了这个问题。
为什么不做这样的事情
try:
#check in py3
except:
#check in py2
如果需要,您可以添加一些其他错误处理程序,但应该这样做。