Python dictionary from an object's fields Python dictionary from an object's fields python python

Python dictionary from an object's fields

Note that best practice in Python 2.7 is to use new-style classes (not needed with Python 3), i.e.

class Foo(object):   ...

Also, there's a difference between an 'object' and a 'class'. To build a dictionary from an arbitrary object, it's sufficient to use __dict__. Usually, you'll declare your methods at class level and your attributes at instance level, so __dict__ should be fine. For example:

>>> class A(object):...   def __init__(self):...     self.b = 1...     self.c = 2...   def do_nothing(self):...     pass...>>> a = A()>>> a.__dict__{'c': 2, 'b': 1}

A better approach (suggested by robert in comments) is the builtin vars function:

>>> vars(a){'c': 2, 'b': 1}

Alternatively, depending on what you want to do, it might be nice to inherit from dict. Then your class is already a dictionary, and if you want you can override getattr and/or setattr to call through and set the dict. For example:

class Foo(dict):    def __init__(self):        pass    def __getattr__(self, attr):        return self[attr]    # etc...

Instead of x.__dict__, it's actually more pythonic to use vars(x).

The dir builtin will give you all the object's attributes, including special methods like __str__, __dict__ and a whole bunch of others which you probably don't want. But you can do something like:

>>> class Foo(object):...     bar = 'hello'...     baz = 'world'...>>> f = Foo()>>> [name for name in dir(f) if not name.startswith('__')][ 'bar', 'baz' ]>>> dict((name, getattr(f, name)) for name in dir(f) if not name.startswith('__')) { 'bar': 'hello', 'baz': 'world' }

So can extend this to only return data attributes and not methods, by defining your props function like this:

import inspectdef props(obj):    pr = {}    for name in dir(obj):        value = getattr(obj, name)        if not name.startswith('__') and not inspect.ismethod(value):            pr[name] = value    return pr