寻找比 `dir` 更好的数据检查工具

4 投票
3 回答
2129 浏览
提问于 2025-04-17 09:43

可能重复的问题:
在Python中有没有函数可以打印一个对象的所有当前属性和它们的值?

在进行交互式Python编程时,我经常使用dir这个函数,来了解一个对象的结构。不过,dir只显示属性的名字,而不显示它们的值,所以它的信息量其实有限。此外,dir的输出格式也不太好,阅读起来不方便(换句话说:dir并不会做什么好看的格式化输出)。

有没有现成的工具可以用来检查数据,它比dir提供的信息更多,而且格式更好呢?

举个例子,一个比dir更有用的替代工具,可以打印出每个属性的值(根据需要进行合适的格式化),并且让输出更容易阅读。如果某些属性的值是可以调用的,它还可以打印出它们的签名和/或文档字符串的第一行。

谢谢!

3 个回答

0

可以看看这个链接:pprint

from pprint import pprint
pprint(object_you_want_to_see)
1

如果你提到的“对象的结构”是指对象的实例属性,那么要知道,dir(某个东西) 这个命令会调用 某个东西.__dir__(),前提是这个东西有一个用户自定义的 __dir__() 方法。如果没有的话,它就会查看 某个东西.__dict__某个东西 的类型(我猜它会调用这个类型的 __dir__() 或者查看这个类型的 __dict__

因此,我认为对象的实例属性是通过它的 __dict__ 属性来获取的。

不过,有些对象没有实例属性,比如整数。

所以,我觉得如果你检查一个对象是否有 __dict__ 属性,如果有的话,获取它的值就能得到你需要的信息:不仅是属性的名字,还有这些名字对应的对象。

既然你问输出的格式,我就用 cPickle 这个模块来举个例子(在 Python 中,模块也是一种对象)

import cPickle

for name,obj in  cPickle.__dict__.iteritems() :
    print '%-25s  -->  %r' % (name, obj)

结果

load                       -->  <built-in function load>
PicklingError              -->  <class 'cPickle.PicklingError'>
__version__                -->  '1.71'
UnpickleableError          -->  <class 'cPickle.UnpickleableError'>
dump                       -->  <built-in function dump>
__builtins__               -->  <module '__builtin__' (built-in)>
Unpickler                  -->  <built-in function Unpickler>
compatible_formats         -->  ['1.0', '1.1', '1.2', '1.3', '2.0']
BadPickleGet               -->  <class 'cPickle.BadPickleGet'>
__package__                -->  None
dumps                      -->  <built-in function dumps>
UnpicklingError            -->  <class 'cPickle.UnpicklingError'>
PickleError                -->  <class 'cPickle.PickleError'>
HIGHEST_PROTOCOL           -->  2
__name__                   -->  'cPickle'
loads                      -->  <built-in function loads>
Pickler                    -->  <built-in function Pickler>
__doc__                    -->  'C implementation and optimization of the Python pickle module.'
format_version             -->  '2.0'

.

还有一个函数 help() 可以提供你需要的文档信息。

3

可以试试inspect模块,它能给你提供很多信息,包括一个函数的原始源代码、调用栈等更多内容:

>>> class Foo:
...     def __init__(self, a, b, c):
...             self.a = a
...             self.b = b
...             self.c = c
...     def foobar(self):
...             return 100
... 
>>> f = Foo(50, 'abc', 2.5)
>>> import inspect
>>> inspect.getmembers(f)
[('__doc__', None), ('__init__', <bound method Foo.__init__ of <__main__.Foo instance at     0x7f0d76c440e0>>), ('__module__', '__main__'), ('a', 50), ('b', 'abc'), ('c', 2.5), ('foobar', <bound method Foo.foobar of <__main__.Foo instance at 0x7f0d76c440e0>>)]
>>> 
>>> def add5(x):
...     """adds 5 to arg"""
...     return 5 + x
... 
>>> inspect.getdoc(add5)
'adds 5 to arg'
>>> # What arguments does add5 take?
>>> inspect.getargspec(add5)
ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)
>>> # Format that nicely...
>>> inspect.formatargspec(inspect.getargspec(add5))
'((x,), None, None, None)'
>>> 

撰写回答