python的var_dump,打印对象内容

from __future__ import print_function
from types import NoneType

__author__ = "Shamim Hasnath"
__copyright__ = "Copyright 2013, Shamim Hasnath"
__license__ = "BSD License"
__version__ = "1.0.1"


TAB_SIZE = 4


infs = []

def display(o, space, num, key, typ):
    st = ""
    l = []
    if key:
        if typ is dict:
            st += " " * space + "['%s'] => "
        else:
            st += " " * space + "%s => "
        l.append(key)
    elif space > 0:
        st += " " * space + "[%d] => "
        l.append(num)
    else:  # at the very start
        st += "#%d "
        l.append(num)

    if type(o) in (tuple, list, dict, int, str, float, long, bool, NoneType, unicode):
        st += "%s(%s) "
        l.append(type(o).__name__)

        if type(o) in (int, float, long, bool, NoneType):
            l.append(o)
        else:
            l.append(len(o))

        if type(o) in (str, unicode):
            st += '"%s"'
            l.append(o)

    elif isinstance(o, object):
        st += "object(%s) (%d)"
        l.append(o.__class__.__name__)
        l.append(len(getattr(o, '__dict__', {})))

    #print(st % tuple(l))
    infs.append(st % tuple(l))

def display_s(o, space, num, key, typ):
    st = ""
    l = []
    if key:
        if typ is dict:
            st += " " * space + "['%s']=>"
        else:
            st += " " * space + "%s=>"
        l.append(key)
    # elif space > 0:
    #     st += " " * space + "[%d] => "
    #     l.append(num)
    # else:  # at the very start
    #     st += "#%d "
    #     l.append(num)

    if type(o) in (tuple, list, dict, int, str, float, long, bool, NoneType, unicode):
        st += "%s"
        # l.append(type(o).__name__)

        if type(o) in (int, float, long, bool, NoneType):
            l.append(o)
        else:
            l.append('')

        if type(o) in (str, unicode):
            st += '"%s"'
            l.append(o)

    elif isinstance(o, object):
        st += "%s"
        l.append(o.__class__.__name__)
        # l.append(len(getattr(o, '__dict__', {})))

    #print(st % tuple(l))
    infs.append(st % tuple(l))


def dump(o, space, num, key, typ):

    if type(o) in (str, int, float, long, bool, NoneType, unicode):
        display(o, space, num, key, typ)

    elif isinstance(o, object):
        display(o, space, num, key, typ)
        num = 0
        if type(o) in (tuple, list, dict):
            typ = type(o)  # type of the container of str, int, long, float etc
        elif isinstance(o, object):
            o = getattr(o, '__dict__', {})
            typ = object
        for i in o:
            space += TAB_SIZE
            if type(o) is dict:
                dump(o[i], space, num, i, typ)
            else:
                dump(i, space, num, '', typ)
            num += 1
            space -= TAB_SIZE

def dump_s(o, space, num, key, typ):

    if type(o) in (str, int, float, long, bool, NoneType, unicode):
        display_s(o, space, num, key, typ)

    elif isinstance(o, object):
        display_s(o, space, num, key, typ)
        num = 0
        if type(o) in (tuple, list, dict):
            typ = type(o)  # type of the container of str, int, long, float etc
        elif isinstance(o, object):
            o = getattr(o, '__dict__', {})
            typ = object
        for i in o:
            space += TAB_SIZE
            if type(o) is dict:
                dump_s(o[i], space, num, i, typ)
            else:
                dump_s(i, space, num, '', typ)
            num += 1
            space -= TAB_SIZE

def _get_space_num(s):
    i = 0
    for c in s:
        if c == ' ':
            i+=1
        else:
            break
    s = s[i:]
    return i,s

def var_dump(*obs):
    """
      shows structured information of a object, list, tuple etc
    """
    global infs
    infs = []
    i = 0
    for x in obs:
        dump(x, 0, i, '', object)
        i += 1
    for inf in infs:
        print(inf)

def var_dump_s(*obs):
    """
      shows structured information of a object, list, tuple etc
    """
    global infs
    infs = []
    i = 0
    for x in obs:
        dump_s(x, 0, i, '', object)
        i += 1
    strs = []
    bsn = 0
    for inf in infs:
        sn, s = _get_space_num(inf)
        if sn > bsn:
            strs.append('{')
        if sn < bsn:
            strs.append('}, ')
        if sn == bsn and sn != 0:
            strs.append(', ')
        strs.append(s)
        bsn = sn
    while bsn > 0:
        strs.append('}')
        bsn = bsn - TAB_SIZE

    return ''.join(strs)

 

测试例子:

from var_dump import *

class A:
    def __init__(self,aa,bb):
        self.a = aa
        self.b = bb

    def pa(self):
        print(self.a,self.b)

class B:
    def __init__(self):
        self.y = 13423
        self.g = 'sdsdsds'
        self.ob = A(223,454)
        a = A(3,4)

a = B()
var_dump(a)
print('---------------------')
s = var_dump_s(a)
print(s)


输出:

#0 object(B) (3)
    y => int(13423) 
    ob => object(A) (2)
        a => int(223) 
        b => int(454) 
    g => str(7) "sdsdsds"
---------------------
B{y=>13423, ob=>A{a=>223, b=>454}, g=>"sdsdsds"}

 

posted @ 2014-05-23 11:17  绿色冰点  Views(5175)  Comments(0Edit  收藏  举报