示例#1
0
def tree(seq,
         deep=None,
         leafColor=u'\x1b[31m%s\x1b[0m',
         __key=u'/',
         __leftStr=None,
         __islast=None,
         __deepNow=0,
         __sets=None):
    '''
    类似bash中的tree命令 简单查看list, tuple, dict, numpy组成的树的每一层结构
    可迭代部分用蓝色 叶子用红色打印 
    >>>tree(seq) 
    
    Parameters
    ----------
    seq : list or tuple or dict or numpy or any Object
        打印出 以树结构展开所有可迭代部分
    deep : int, default None
        能显示的最深深度, 默认不限制
    
    ps.可在__logFuns中 新增类别
    '''
    if deep and __deepNow > deep:
        return
    if __leftStr is None:
        __leftStr = []
        __islast = 1
        __sets = set()
#    s = __logFuns.get(type(seq),lambda x:colorFormat.r%tounicode(x)[:60])(seq)
    s = __discribOfInstance(seq, leafColor=leafColor)
    s = s.replace('\n', u'↳')
    #    print ''.join(__leftStr)+u'├── '+tounicode(k)+': '+s
    print u'%s%s %s: %s' % (u''.join(__leftStr), u'└──'
                            if __islast else u'├──', tounicode(__key), s)
    if isinstance(seq, (list, tuple, dict)):
        if id(seq) in __sets:
            seq = [(colorFormat.r % u'【printed befor】', '')]
        else:
            __sets.add(id(seq))
            if isinstance(seq, (list, tuple)):
                seq = list(enumerate(seq))
            elif isinstance(seq, (dict)):
                seq = list(seq.items())


#            elif isinstance(seq, abc.types.GeneratorType)
    else:
        return
    __leftStr.append(u'    ' if __islast else u'│   ')
    for i, kv in enumerate(seq):
        __key, v = kv
        tree(v,
             deep=deep,
             leafColor=leafColor,
             __key=__key,
             __leftStr=__leftStr,
             __islast=(i == len(seq) - 1),
             __deepNow=__deepNow + 1,
             __sets=__sets)
    __leftStr.pop()
示例#2
0
def loga(array):
    '''
    Analysis np.array with a graph. include shape, max, min, distribute
    '''
    typeName = typestr(array)
    if typeName in __typesToNumpy:
        array = __typesToNumpy[typeName](array)
    if isinstance(array, str) or isinstance(array, unicode):
        print 'info and histogram of', array
        l = []
        eval('l.append(' + array + ')')
        array = l[0]
    if isinstance(array, list):
        array = np.array(array)

    strr = [
        colorFormat.r % tounicode(s)
        for s in (str(array.shape), typeNameOf(array.dtype.type),
                  len(array) and (array.max()), len(array) and (array.min()))
    ]
    print('shape:%s ,type:%s ,max: %s, min: %s' % tuple(strr))

    unique = np.unique(array)
    if len(unique) < 10:
        dic = dict([(i * 1, 0) for i in unique])
        for i in array.ravel():
            dic[i] += 1
        listt = dic.items()
        listt.sort(key=lambda x: x[0])
        data, x = [v for k, v in listt], np.array([k for k, v in listt
                                                   ]).astype(float)
        if len(x) == 1:
            print 'All value is', x[0]
            return
        width = (x[0] - x[1]) * 0.7
        x -= (x[0] - x[1]) * 0.35
    elif not (np.isfinite(array)).all():
        finiteInd = np.isfinite(array)
        finite = array[finiteInd]
        data, x = np.histogram(finite, 8)
        size = array.size
        nan = np.isnan(array).sum()
        nans = '"nan":%s (%.2f%%), ' % (nan, 100. * nan / size) if nan else ''
        inf = np.isinf(array).sum()
        infs = '"inf":%s (%.2f%%), ' % (inf, 100. * inf / size) if inf else ''
        print '\n%s%s max: %s, min: %s' % (nans, infs, len(finite) and
                                           (finite.max()), len(finite) and
                                           (finite.min()))
        x = x[1:]
        width = (x[0] - x[1])
    else:
        data, x = np.histogram(array.ravel(), 8)
        x = x[1:]
        width = (x[0] - x[1])
    plt.plot(x, data, color='orange')
    plt.bar(x, data, width=width, alpha=0.5, color='b')
    plt.show()
    return
示例#3
0
def __discribOfInstance(instance, leafColor=None, MAX_LEN=45):
    typee = type(instance)
    typen = typeNameOf(typee)
    #    print typen,typen in __logFuns
    if typen in __logFuns:
        return __logFuns[typen](instance)
    s = tounicode(instance)
    if len(s) > MAX_LEN:
        s = s[:MAX_LEN - 3] + '...'
    return (leafColor or '%s') % s
示例#4
0
def getFunDoc(f):
    if '__doc__' in dir(f) and f.__doc__:
        return ' : %s' % (colorFormat.black % tounicode(f.__doc__))
    return ''
示例#5
0
def __dira(seq,
           instance=None,
           maxDocLen=50,
           deep=None,
           __leftStr=None,
           __key=u'/',
           __islast=None,
           __deepNow=0,
           __sets=None):
    '''
    类似bash中的tree命令 简单查看instance的 __attrs__ 组成的树的结构
    attr name用红色;str(instance.attr)用蓝色;
    如果attr 为instancemethod,builtin_function_or_method,method-wrapper之一
    instance.attr.__doc__用黑色 
    
    ps.可在__attrLogFuns中 新增常见类别
    '''
    if deep and __deepNow > deep:
        return
    s = __discribOfInstance(seq, colorFormat.b, MAX_LEN=maxDocLen)
    if maxDocLen < 100:
        s = s.replace('\n', '↳')
    if __leftStr is None:
        __leftStr = []
        __islast = 1
        __sets = set()
        doc = '' if instance is None else getFunDoc(instance)
        if len(doc) > maxDocLen:
            doc = doc[:maxDocLen - 3] + '...'
        s = colorFormat.b % (
            '%d attrs%s' %
            (len(seq), doc.replace('\n', '↳').replace(' :', ',', 1)))


#    print ''.join(__leftStr)+u'├── '+tounicode(k)+': '+s
    print u'%s%s %s: %s' % (u''.join(__leftStr), u'└──' if __islast else
                            u'├──', colorFormat.r % tounicode(__key), s)
    if isinstance(seq, (list, tuple, dict)):
        if id(seq) in __sets:
            seq = [(colorFormat.r % u'【printed befor】', '')]
        else:
            __sets.add(id(seq))
            if isinstance(seq, (list, tuple)):
                seq = list(enumerate(seq))
            elif isinstance(seq, (dict)):
                seq = list(seq.items())
                seq.sort(key=lambda x: x[0])
    else:
        return
    __leftStr.append(u'    ' if __islast else u'│   ')
    for i, kv in enumerate(seq):
        __key, v = kv
        __dira(v,
               maxDocLen=maxDocLen,
               deep=deep,
               __leftStr=__leftStr,
               __key=__key,
               __islast=(i == len(seq) - 1),
               __deepNow=__deepNow + 1,
               __sets=__sets)  #leafColor=colorFormat.black)
    __leftStr.pop()
示例#6
0
def treem(mod,
          types=None,
          deep=None,
          __leftStrs=None,
          __name=u'/',
          __islast=None,
          __deepNow=0,
          __rootDir=None,
          __sets=None):
    '''
    类似bash中的tree命令 查看module及子module的每一层结构
    一目了然module的结构和api
    module用红色显示 其余部分用蓝色显示
    >>>treem(os)
    
    Parameters
    ----------
    mod : module
        显示出 以树结构展开module及其子module
        type(mod) should => module
    types : list of types, default None
        需要显示出来的类型(module 类型会自动添加)
        默认显示所有类型
    deep : int, default None
        能显示的最深深度
        默认不限制
    '''
    if deep and __deepNow > deep:
        return
    if __leftStrs is None:
        __leftStrs = []
        __islast = 1
        if '__file__' not in dir(mod):
            print 'type(%s: %s) is not module!' % (logMod(mod), tounicode(mod))
            return
        __rootDir = os.path.dirname(mod.__file__)
        __sets = set()
    typeStr = logMod(mod)
    modKinds = ['', '', '(not sub-module)', '(printed befor)']
    modKind = 0
    if isinstance(mod, type(os)):
        if '__name__' in dir(mod):
            __name = mod.__name__
        modKind = 1
        dirMod = dir(mod)
        if mod in __sets:
            modKind = 3
        elif '__file__' not in dir(mod) or __rootDir not in mod.__file__:
            modKind = 2
    names = (tounicode(__name) +
             ('   ' if modKind < 2 else u'  ·') * 20)[:40] + modKinds[modKind]

    print u'%s%s %s: %s' % (u''.join(__leftStrs),
                            u'└──' if __islast else u'├──', typeStr, names)

    if modKind != 1:
        return
    __sets.add(mod)
    dirMod = [
        i for i in dirMod
        if i not in ['__name__', '__file__', 'unicode_literals']
    ]
    if types is not None:
        dirMod = [
            i for i in dirMod
            if type(mod.__getattribute__(i)) in list(types) + [type(os)]
        ]
    __leftStrs.append(u'    ' if __islast else u'│   ')
    for i, name in enumerate(dirMod):
        e = mod.__getattribute__(name)
        treem(e,
              types,
              deep,
              __leftStrs,
              name,
              __islast=(i == len(dirMod) - 1),
              __deepNow=__deepNow + 1,
              __rootDir=__rootDir,
              __sets=__sets)
    __leftStrs.pop()
示例#7
0
def __typee__(x):
    return tounicode(type(x)).split("'")[1]
示例#8
0
             __islast=(i == len(seq) - 1),
             __deepNow=__deepNow + 1,
             __sets=__sets)
    __leftStr.pop()
tree = FunAddMagicMethod(tree)


def __typee__(x):
    return tounicode(type(x)).split("'")[1]


logModFuns = {
    type(os): lambda x: colorFormat.r % (__typee__(x)),
}
logMod = lambda mod: logModFuns.get(
    type(mod), lambda x: colorFormat.b % tounicode(__typee__(x))[:60])(mod)


def treem(mod,
          types=None,
          deep=None,
          __leftStrs=None,
          __name=u'/',
          __islast=None,
          __deepNow=0,
          __rootDir=None,
          __sets=None):
    '''
    类似bash中的tree命令 查看module及子module的每一层结构
    一目了然module的结构和api
    module用红色显示 其余部分用蓝色显示