"""Python introspection functions; treating Classes as Frames.
Very primilinary...
"""
__author__ = "Will Fitzgerald (wfitzg@kzoo.edu)"
__version__ = "$Revision: 1.2$"
__date__ = "$Date: 2003/02/05 $"
__copyright__ = "Copyright (c) 2003 Will Fitzgerald"
__license__ = "Python"
class Frame(object):
pass
def is_class(x):
return isinstance(x,type)
def is_instance(x):
if isinstance(x,type):
return 0
else:
return 1
def attribute_value(obj,attribute):
for abst in all_abstractions(obj):
val = None
try:
val = abst.__dict__.get(attribute,None)
except AttributeError:
pass
if val != None:
return val
return None
def methods_of(parent):
return filter(None,dict(parent.__dict__).itervalues())
def name(x):
name = x
try:
name = x.__name__
finally:
return name
def set_name(x,name):
if is_instance(x):
x.__name__ = name
def isa(child,parent):
if (child==parent):
return 1
elif is_class(parent) and isinstance(child,parent):
return 1
elif is_class(child) and is_class(parent) and issubclass(child,parent):
return 1
else:
return 0
def parents(x):
if is_class(x):
return list(x.__bases__)
else:
return [x.__class__]
def allparents(x):
if is_class(x):
return list(x.__mro__)
else:
return list(type(x).__mro__)
def all_abstractions(x):
if isinstance(x,Description):
return all_abstractions(x.base)
elif is_class(x):
return list(x.__mro__)
else:
return [x] + list(type(x).__mro__)
def subclasses_of(parent):
return filter(lambda (x):is_class(x) and x!=parent and issubclass(x,parent),globals().itervalues())
def instances_of(parent):
return filter(lambda (x): isinstance(x,parent),globals().itervalues())