• 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"}
  • 相关阅读:
    多线程和异步
    Win7 系统证书链错误
    应用项目迁移到 dotnet 6 的经验和决策
    工具大全(自动化、接口、性能、安全、测试管理)
    从零搭建 Npm 包持续集成
    进程、线程和协程
    Drools 入门案例——手把手教你
    如何安装Virtual Box的VBox Guest Additions扩展程序
    betterZip解压后压缩包会删除 zip文件解压后原压缩文件能不能删掉
    undefined method `license' when mac brew install
  • 原文地址:https://www.cnblogs.com/moodlxs/p/3747218.html
Copyright © 2020-2023  润新知