以前在Python(2.6)中可以问:
isinstance(f, file)
但是在Python 3.0中file
was removed。
现在检查变量是否为文件的正确方法是什么? What'sNew文档没有提到这个......
答案 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)
答案 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
,或者其他什么?