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

问题描述 投票:5回答:3

是否有与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 python-3.x python-2.7 compatibility
3个回答
2
投票

我发现最常见的方法是在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')   

0
投票

这是我使用的解决方法:在.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和混乱,因为它使它看起来像IOBasefile的Python 3版本,但事实并非如此。但它确实解决了这个问题。


-1
投票

为什么不做这样的事情

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

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

© www.soinside.com 2019 - 2024. All rights reserved.