【问题标题】:Looking for better data inspector than `dir` [duplicate]寻找比`dir`更好的数据检查器[重复]
【发布时间】:2012-02-04 15:49:55
【问题描述】:

可能重复:
Is there a function in Python to print all the current properties and values of an object?

在交互式 python 会话中,我大量使用 dir 函数来了解对象的结构。不幸的是,dir 只显示属性的名称,而不是它们的值,因此它远没有提供尽可能多的信息。此外,dir 的打印输出没有尝试格式化输出以便于阅读(IOW:dir don't do no no stinkin' pretty-print)。

我在哪里可以找到一个“现成的”数据检查实用程序,它信息量更大、格式更好,dir

例如,dir 的一个更有用的替代方法是打印与每个属性关联的值(根据需要进行适当的格式化),并格式化此输出以便于阅读。对于值可调用的属性,它将打印它们的签名和/或它们的文档字符串的第一行。

谢谢!

【问题讨论】:

  • 你可以考虑使用 IPython。

标签: python


【解决方案1】:

如果 "object's structure" 是指对象的实例属性,请注意 dir(something) 调用 something.__dir()__ 如果存在名称为 __dir__() 的用户定义方法,否则它会检查 something.__dict__something 的类型(我想那就是调用类型的__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() 可以带来您正在搜索的文档。

【讨论】:

  • __dir__ 仅在 Python 3 中可用。
  • @Ethan Furman 我在我的答案中使用 Python 2.7 执行了代码,而不是在 Python 3.x 中,因为它可以从打印指令的编写方式中推断出来。 __dict__ 至少存在于 Python 1.5 (docs.python.org/release/1.5/lib/node270.html)
  • @Ethan Furman 我做错了,你说的不是__dict__,而是__dir__。你是对的:在 Python 3 中有描述,而在 Python 2 中没有描述。但我认为这只是一个关于 Python 2 的遗漏,因为在 dir 的描述中同样引用了 __dir__ 方法。感谢您的评论,我意识到 __dir__ 不是为某些对象而不是为其他对象自动创建的内置方法;它是一个保留给用户使用的名称:如果用户用这个名称定义了一个用户定义的方法,这个方法将自动调用dir()
  • 我说的是__dir__,而不是__dict__。但是,__dir__ 似乎是在 2.6 中添加的,因此感谢您的反馈。 :)
【解决方案2】:

查看pprint

from pprint import pprint
pprint(object_you_want_to_see)

【讨论】:

  • 没有inspectdir 类属性或对象成员,只是运行对象的.str().repr() 方法并对其进行格式化。
【解决方案3】:

试试检查模块,它可以为您提供各种各样的东西,包括函数的原始源代码、堆栈帧等等:

>>> 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)'
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多