如何整齐地解析变量()的输出?

时间:2017-02-08 22:49:37

标签: python object io ipython

有没有办法通过vars查看Python对象的属性,但输出格式是干净的,并且它没有显示每个属性的所有值? (例如,占据所有屏幕的大型阵列)。我基本上只想要一个很好的清单列表。

2 个答案:

答案 0 :(得分:3)

如果你想要一个对象vars的键列表,那就是

list(vars(whatever))

或者您可以通过按键并按照自己的行打印:

for attr in vars(whatever):
    print(attr)

或者你可以用pprint打印dict(尽管它可能不比IPython的默认漂亮打印更漂亮):

import pprint
pprint.pprint(vars(whatever))

或者您可以编写任何您认为可读的方式来查看vars给您的信息。你总是可以自由编写自己的代码。

还有dir(whatever),其目的是提供对交互式检查有用的对象属性列表。 dir(whatever)通常与list(vars(whatever))不同;例如,它将包括方法。

答案 1 :(得分:1)

您想要一个属性名称列表vars keys吗?或完整字典,keysvalues?根据对象类vars可能是空的,只有几个标量和字符串,或者一组大而复杂的列表,数组等。没有通用的“漂亮的打印机”#39;您无法为所有课程生成清晰的显示。 __str____repr__方法的目的是生成对象属性的有用显示。

在我当前的ipython会话中

变量是:

In [97]: who
M    argparse    arr     b   choices     forbool     np  nr  parser  
product  sparse  sys     

一个是具有空值的用户定义函数

In [99]: forbool
Out[99]: <function __main__.forbool>

In [100]: vars(forbool)
Out[100]: {}

一个是稀疏矩阵,具有适度数量的属性。此示例只有5个非零值,因此数组非常小。是的,numpy数组可能非常大。它们的显示由numpy代码控制。

In [101]: M
Out[101]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements in LInked List format>

In [102]: vars(M)
Out[102]: 
{'_shape': (5, 5),
 'data': array([[1.0], [1.0], [1.0], [1.0], [1.0]], dtype=object),
 'dtype': dtype('float64'),
 'maxprint': 50,
 'rows': array([[0], [1], [2], [3], [4]], dtype=object)}

argparse是一个导入的模块,有许多变量。其一,doc占用了近一页。

In [103]: len(vars(argparse))
Out[103]: 52

arr是一个数组,并且没有__dict__,而vars(arr)会出错。

这是此显示的whos显示。数组以ipython独有的精简形式显示。

In [108]: %whos
Variable   Type              Data/Info
--------------------------------------
M          lil_matrix          (0, 0)   1.0\n  (1, 1)   1.<...> (3, 3)  1.0\n  (4, 4)   1.0
argparse   module            <module 'argparse' from '<...>b/python3.5/argparse.py'>
arr        ndarray           10x3: 30 elems, type `int32`, 120 bytes
b          ndarray           4x2: 8 elems, type `int32`, 32 bytes
choices    list              n=16
forbool    function          <function forbool at 0xb52950bc>
np         module            <module 'numpy' from '/us<...>kages/numpy/__init__.py'>
nr         int               3
parser     ArgumentParser    ArgumentParser(prog='ipyt<...>r='error', add_help=True)
product    type              <class 'itertools.product'>
sparse     module            <module 'scipy.sparse' fr<...>cipy/sparse/__init__.py'>
sys        module            <module 'sys' (built-in)>

你可以写一个漂亮的打印机。这是一个开始:

def pprt(var):
    for k,v in vars(var).items():
        if isinstance(v, np.ndarray):
            astr = 'array {},{}'.format(v.dtype, v.shape)
        if isinstance(v, (list, tuple, dict)):
            if len(v)>10:
                astr = 'big '+type(v)
            else:
                astr = str(v)
        elif isinstance(v, str):
            astr = v[:20]
        else:
            astr = str(v)
        print(k,':',astr)

对于稀疏矩阵

In [123]: pprt(M)
_shape : (5, 5)
dtype : float64
rows : [[0] [1] [2] [3] [4]]
data : [[1.0] [1.0] [1.0] [1.0] [1.0]]
maxprint : 50

但是对于argparse parser对象,它显然是不合适的:

In [124]: pprt(parser)
conflict_handler : error
usage : None
prefix_chars : -
_action_groups : [<argparse._ArgumentGroup object at 0xb0c802ac>, <argparse._ArgumentGroup object at 0xb0c99ccc>]
_mutually_exclusive_groups : []
allow_abbrev : True
_optionals : <argparse._ArgumentGroup object at 0xb0c99ccc>
prog : ipython3
description : None
_actions : [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), _StoreAction(option_strings=['--k'], dest='k', nargs=None, const=None, default=100, type=<class 'int'>, choices=None, help='numbers, %(default)s', metavar=None)]
....

该对象有许多属性;有些人有长名。有些是带有几个键的词典,但值很长。我必须做一些递归来压缩它们。因此可以编写一个紧凑的显示器,但这将是很多工作。