I\'m trying to convert the data from a simple object graph into a dictionary. I don\'t need type information or methods and I don\'t need to be able to convert it back to an
I don't know what is the purpose of checking for basestring or object is? also dict will not contain any callables unless you have attributes pointing to such callables, but in that case isn't that part of object?
so instead of checking for various types and values, let todict convert the object and if it raises the exception, user the orginal value.
todict will only raise exception if obj doesn't have dict e.g.
class A(object):
def __init__(self):
self.a1 = 1
class B(object):
def __init__(self):
self.b1 = 1
self.b2 = 2
self.o1 = A()
def func1(self):
pass
def todict(obj):
data = {}
for key, value in obj.__dict__.iteritems():
try:
data[key] = todict(value)
except AttributeError:
data[key] = value
return data
b = B()
print todict(b)
it prints {'b1': 1, 'b2': 2, 'o1': {'a1': 1}} there may be some other cases to consider, but it may be a good start
special cases if a object uses slots then you will not be able to get dict e.g.
class A(object):
__slots__ = ["a1"]
def __init__(self):
self.a1 = 1
fix for the slots cases can be to use dir() instead of directly using the dict