Python 2.7 tempfile.NamedTemporaryFile返回类型为';实例';不是';文件';。为什么?

Python 2.7 tempfile.NamedTemporaryFile返回类型为';实例';不是';文件';。为什么?,python,python-2.7,types,temporary-files,Python,Python 2.7,Types,Temporary Files,一些库检查输入类型f是否为file。Python 2.7库tempfile返回类型为file的对象 type(tempfile.TemporaryFile()) # type is file 以及 type(tempfile.NamedTemporaryFile()) # type is instance 是有什么原因还是只是一个bug?读取NamedTemporary文件: 返回的对象始终是一个类似文件的对象,其file属性是底层的true file对象。这个类似文件的对象可以在wit

一些库检查输入类型f是否为file。Python 2.7库tempfile返回类型为file的对象

type(tempfile.TemporaryFile())  # type is file
以及

type(tempfile.NamedTemporaryFile())  # type is instance
是有什么原因还是只是一个bug?

读取NamedTemporary文件:

返回的对象始终是一个类似文件的对象,其
file
属性是底层的true file对象。这个类似文件的对象可以在
with
语句中使用,就像普通文件一样

现在来看,
TemporaryFile
NamedTemporaryFile
实际上都是工厂函数。根据操作系统的不同,
TemporaryFile
可以简单地返回低级文件句柄(在不兼容posix的系统和cygwin上,
TemporaryFile
NamedTemporaryFile
NamedTemporaryFile
始终返回
\u TemporaryFileWrapper
的实例,该实例是一个老式类(因此称为
'instance'
),用于包装低级文件句柄


我不会说这是一个bug(虽然,可能是qwirky,因为命名约定没有遵循PEP8),因为所有的行为都是按照文档进行的——毕竟,返回的值都是类似文件的。

我使用NamedTemporaryFile时遇到的问题是pylint抱怨结果不可编辑。可能这是pylint中的一个bug

#!/usr/bin/python

'''
Test program for pylint complaint about file-like object returned from
tempfile functions.
'''

import tempfile

cmdOut = tempfile.NamedTemporaryFile(prefix="tmp-scc-cmd-stderr")
print "Return value from NamedTemporaryFile() is %s" % type(cmdOut)

print >>cmdOut, "foo\nbar"              # send two lines of output

cmdOut.seek(0)                          # go back to beginning to read output
for line in cmdOut:
    print line.rstrip()
报告的类型为“实例”

% python ~/perl/tempfile-pylint.py
Return value from NamedTemporaryFile() is <type 'instance'>
foo
bar

我同意这不是tempfile中的bug,但在这种情况下确实会造成一些混乱。

我不认为这是bug,因为所有的行为都是文档记录的。对于这两个函数实际返回的类型没有任何保证——只保证它是“类似文件的”。现在,100万美元的问题。。。为什么这对你很重要?还有其他(可能相关的)问题需要我们帮助吗?@mgilson也许只是好奇?@glglglgl——可能(这是个不错的理由)。但是,我猜这与第一行有关:“一些库检查输入f的类型是否为file。”不,我告诉过一些库检查我是否通过了它的file。它会像检查isinstance(输入文件,文件)一样检查它。因此,我的代码不起作用,因为我需要命名临时文件并将其与此第三方库一起使用。但问题是,它看起来像file,所有方法都像file对象,但当一些库检查是否为argument file object时,此库的类型==instance not file。
E: 14,12: Non-iterable value cmdOut is used in an iterating context (not-an-iterable)