如何检查对象是否是“文件”的实例?

时间:2010-09-24 03:17:17

标签: python python-3.x

以前在Python(2.6)中可以问:

isinstance(f, file)

但是在Python 3.0中file was removed

现在检查变量是否为文件的正确方法是什么? What'sNew文档没有提到这个......

4 个答案:

答案 0 :(得分:5)

def read_a_file(f)
    try:
        contents = f.read()
    except AttributeError:
        # f is not a file

替换您计划用于read的任何方法。如果您希望在超过98%的时间内传递像对象这样的文件,那么这是最佳选择。如果您希望在2%以上的时间内传递非对象文件,那么正确的做法是:

def read_a_file(f):
    if hasattr(f, 'read'):
        contents = f.read()
    else:
        # f is not a file

如果您 可以访问file类进行测试,那么这就是您要做的事情。 (和FWIW,我在2.6上也有file)请注意,此代码也适用于3.x.

答案 1 :(得分:4)

在python3中,您可以引用io而不是file并写入

import io
isinstance(f, io.IOBase)

答案 2 :(得分:1)

通常,您不需要检查对象类型,您可以使用duck-typing,即直接调用f.read()并允许可能的异常传播 - 这可能是一个错误你的代码或调用者代码中的错误,例如json.load()如果你给它一个没有AttributeError属性的对象,就会引发read

如果您需要区分几种可接受的输入类型;你可以使用hasattr/getattr

def read(file_or_filename):
    readfile = getattr(file_or_filename, 'read', None)
    if readfile is not None: # got file
       return readfile()
    with open(file_or_filename) as file: # got filename
       return file.read()

如果您想支持file_of_filename可能read属性设置为None的案例,那么您可以使用try/except而不是file_or_filename.read - 注意:没有parens,呼叫没有 - 例如,ElementTree._get_writer()

如果要检查某些保证,例如,只进行一次系统调用(io.RawIOBase.read(n)对于n> 0)或没有短写(io.BufferedIOBase.write())或是否读/写方法接受文本数据(io.TextIOBase),然后您可以将isinstance()函数与ABCs defined in io module一起使用,例如look at how saxutils._gettextwriter() is implemented

答案 3 :(得分:-3)

在python 2.6上为我工作...你是否处于一个陌生的环境中,默认情况下没有导入内置函数,或者某人已经完成del file,或者其他什么?