Tuesday, June 5, 2012

What is a python equivalent of PHP"s var_dump()


When debugging in PHP I frequently find it useful to simply stick a var_dump ($foo, $bar, ...) in my code to show me the the what a variable is, what is value is, and the same for anything that it contains.



What is a good Python equivalent for this?



I have seen several things in my Google searching that are somewhat equivalent, but nothing that is the same or better.


Source: Tips4all

8 comments:

  1. To display a value nicely, you can use the pprint module. The easiest way to dump all variables with it is to do

    import pprint

    pprint.pprint(globals())
    pprint.pprint(locals())


    If you are running in CGI, a useful debugging feature is the cgitb module, which displays the value of local variables as part of the traceback.

    ReplyDelete
  2. I think the best equivalent to PHP's var_dump($foo, $bar) is:


    print vars(foo),vars(bar)

    ReplyDelete
  3. PHP's var_export() usually shows a serialized version of the object that can be exec()'d to re-create the object. The closest thing to that in Python is repr()

    "For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval() [...]"

    ReplyDelete
  4. So I have taken the answers from this question and another question and came up below. I suspect this is not pythonic enough for most people, but I really wanted something that let me get a deep representation of the values some unknown variable has. I would appreciate any suggestions about how I can improve this or achieve the same behavior easier.

    def dump(obj):
    '''return a printable representation of an object for debugging'''
    newobj=obj
    if '__dict__' in dir(obj):
    newobj=obj.__dict__
    if ' object at ' in str(obj) and not newobj.has_key('__type__'):
    newobj['__type__']=str(obj)
    for attr in newobj:
    newobj[attr]=dump(newobj[attr])
    return newobj


    Here is the usage

    class stdClass(object): pass
    obj=stdClass()
    obj.int=1
    obj.tup=(1,2,3,4)
    obj.dict={'a':1,'b':2, 'c':3, 'more':{'z':26,'y':25}}
    obj.list=[1,2,3,'a','b','c',[1,2,3,4]]
    obj.subObj=stdClass()
    obj.subObj.value='foobar'

    from pprint import pprint
    pprint(dump(obj))


    and the results.

    {'__type__': '<__main__.stdClass object at 0x2b126000b890>',
    'dict': {'a': 1, 'c': 3, 'b': 2, 'more': {'y': 25, 'z': 26}},
    'int': 1,
    'list': [1, 2, 3, 'a', 'b', 'c', [1, 2, 3, 4]],
    'subObj': {'__type__': '<__main__.stdClass object at 0x2b126000b8d0>',
    'value': 'foobar'},
    'tup': (1, 2, 3, 4)}

    ReplyDelete
  5. print

    For your own classes, just def a __str__ method

    ReplyDelete
  6. I use self-written Printer class, but dir() is also good for outputting the instance fields/values.

    class Printer:

    def __init__ (self, PrintableClass):
    for name in dir(PrintableClass):
    value = getattr(PrintableClass,name)
    if '_' not in str(name).join(str(value)):
    print ' .%s: %r' % (name, value)


    The sample of usage:

    Printer(MyClass)

    ReplyDelete
  7. The closest thing to php's var_dump is pprint with the getmembers() function in the built-in inspect module.

    from inspect import getmembers()
    from pprint import pprint
    pprint(getmembers(yourObj))

    ReplyDelete
  8. Good day. i have not php experience but i have understanding about python standart library.

    For your purposes python have a several methods:

    logging module;

    object serialization module which called pickle;
    You may write your own wrapper of pickle module.

    If your using var_dump for testing, python have a own doctest and unittest modules. it's very simple and fast for design.

    ReplyDelete