pythonは、オブジェクトがファイルオブジェクトであるか否かを判断する(file object)


方法1:typeの比較
1つ目の方法は、オブジェクトのtypeがfileであるかどうかを判断することですが、fileから継承されたサブクラスには適用されません.
 
>>> f = open(r"D:\2.zip")
>>> type(f)
<type 'file'>
>>> type(f) == file
True
>>> class MyFile(file):
	pass

>>> mf = MyFile(r"D:\2.txt")
>>> type(mf)
<class '__main__.MyFile'>
>>> type(mf) == file
False

方法2:isinstance
オブジェクトがファイルオブジェクトであるかどうかを判断するには、isinstance()で直接判断します.
次のコードでは、openで得られたオブジェクトfタイプはfileであり、もちろんfileのインスタンスであり、filenameタイプはstrであり、当然fileのインスタンスではない
 
>>> isinstance(f, file)
True
>>> isinstance(mf, file)
True
>>> filename = r"D:\2.zip"
>>> type(filename)
<type 'str'>
>>> isinstance(filename, file)
False

方法3:duck like(アヒルみたい)
pythonでは、タイプはそれほど重要ではありません.重要なのは「インタフェース」です.アヒルのように歩いていて、鳴き声もアヒルのように鳴いているなら、私たちはアヒルだと思っています(少なくとも歩くことと鳴き声のような行為です).
この考え方によれば,1つのオブジェクトに呼び出し可能なread,write,closeメソッド(属性)があるか否かを判断する第3の判断方法がある.
参照:http://docs.python.org/glossary.html#term-file-object
def isfilelike(f):
    """
    Check if object 'f' is readable file-like 
	that it has callable attributes 'read' , 'write' and 'close'
    """
	try:
		if isinstance(getattr(f, "read"), collections.Callable) \
			and isinstance(getattr(f, "write"), collections.Callable) \
				and isinstance(getattr(f, "close"), collections.Callable):
			return True
	except AttributeError:
		pass
	return False

その他:読み取り/書き込みで開く「クラスファイル」オブジェクト
ファイルからデータを読み込むときだけ、オブジェクトにread、closeがあるかどうかをチェックします.対応するファイルにのみデータを書き込む場合は、オブジェクトにwrite、closeメソッドがあるかどうかを確認するだけです.歩き方だけでアヒルかどうかを判断し、「アヒルのように歩く」かどうかを検査し、音だけで判断すれば「アヒルのように鳴く」かどうかを検査するだけだ.
def isfilelike_r(f):
    """
    Check if object 'f' is readable file-like 
	that it has callable attributes 'read' and 'close'
    """
	try:
		if isinstance(getattr(f, "read"), collections.Callable) \
			and isinstance(getattr(f, "close"), collections.Callable):
			return True
	except AttributeError:
		pass
	return False

def isfilelike_w(f):
    """
    Check if object 'f' is readable file-like 
	that it has callable attributes 'write' and 'close'
    """
	try:
		if isinstance(getattr(f, "write"), collections.Callable) \
			and isinstance(getattr(f, "close"), collections.Callable):
			return True
	except AttributeError:
		pass
	return False

また、hasattrではなくgetattrを使用する理由
ここでなぜhasattrではなくgetattrでAttributeErrorを投げ出すリスクを負うのでしょうか.
一方,hasattrはgetattrを直接呼び出してAttributeErrorが投げ出されたかどうかを確認し,投げ出されなければTrueを返し,そうでなければFalseを返し,ここを参照する.それなら、私たちは自分でこの仕事を完成することができます.
一方、属性オブジェクトを得ることができ、isinstanceでcollectionsであるか否かを判断することができる.Callableの例.両方を組み合わせて、この属性があり、呼び出すことができる場合はTrueを返します.
アドレス1:ソースコードfilehelperをダウンロードする.zip
アドレス2:ソースコードfilehelperをダウンロードする.zip