有没有办法通过vars
查看Python对象的属性,但输出格式是干净的,并且它没有显示每个属性的所有值? (例如,占据所有屏幕的大型阵列)。我基本上只想要一个很好的清单列表。
答案 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
吗?或完整字典,keys
和values
?根据对象类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)]
....
该对象有许多属性;有些人有长名。有些是带有几个键的词典,但值很长。我必须做一些递归来压缩它们。因此可以编写一个紧凑的显示器,但这将是很多工作。