from types import *
def check_type(obj,atts=[],callables=[]):
got_atts=True
for att in atts:
if not hasattr(obj,att):
got_atts=False;break
got_callables=True
for call in callables:
if not hasattr(obj,call):
got_callables=False;break
the_attr=getattr(obj,call)
if not callable(the_attr):
got_callables=False;break
if got_atts and got_callables: return -1
return 0
def is_iter(obj):
if isinstance(obj,ListType): return 1
if isinstance(obj,TupleType): return 1
if isinstance(obj,DictType): return 1
if isinstance(obj,FileType): return 1
try:
iter(obj)
return -1
except TypeError:
return 0
def is_gen(obj):
if isinstance(obj,GeneratorType): return 1
return 0
def is_seq(obj):
if isinstance(obj,ListType): return 1
if isinstance(obj,TupleType): return 1
if is_iter(obj):
try:
obj[0:0]
return -1
except TypeError:
pass
return 0
def is_mapping(obj):
if isinstance(obj,DictType): return 1
if is_iter(obj):
return check_type(obj,callables=['iteritems','has_key'])
return 0
def is_list(obj):
if isinstance(obj,ListType): return 1
if is_seq(obj):
if check_type(obj,callables=['append','extend','pop']): return -1
return 0
def is_str(obj):
if isinstance(obj, basestring): return 1
if is_iter(obj):
if check_type(obj,callables=['index','count','replace']): return -1
return 0
def is_file(obj):
if isinstance(obj,FileType): return 1
if check_type(obj,callables=['read','close']): return -1
return 0
def check_all(obj):
result=[ str(i) for i in (is_iter(obj),is_gen(obj),is_seq(obj),is_list(obj),is_str(obj),is_mapping(obj),is_file(obj))]
return '\t'.join(result)
#####################examples
print '\t'+'\t'.join(['iter','gen','seq','list','str','dict','file'])
print 'str\t',check_all('str')
print '(1,)\t',check_all((1,))
print '[]\t',check_all([])
print '{}\t',check_all({})
f=open('tmp.txt','w')
print 'file\t',check_all(f)
import cStringIO
cstr=cStringIO.StringIO()
print 'cstrio\t',check_all(cstr)
gen=(i for i in (1,2,3))
print 'gen\t',check_all(gen)
def test(): yield 1
print 'test()\t',check_all(test())
class fdict:
def iteritems(self): pass
def has_key(self): pass
print 'fdict\t',check_all(fdict)