zoukankan      html  css  js  c++  java
  • 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"}
  • 相关阅读:
    【译】第26节---配置一对多关系
    【译】第25节---配置一对一关系
    【译】第24节---Fluent API
    pycharm 更改创建文件默认路径和修改字体大小
    软件工程----自我介绍
    课堂作业---读取文件实现求数组中所有子数组和的最大值
    实现数组中连续子数组值和最大
    android-----实现不两个不同的activity的跳转和数据传递
    android------解决editText只输入一行和textView不显示过多的内容
    android-------实现底部导航的模板
  • 原文地址:https://www.cnblogs.com/moodlxs/p/3747218.html
Copyright © 2011-2022 走看看