当前位置:  开发笔记 > 编程语言 > 正文

我如何查看Python对象?

如何解决《我如何查看Python对象?》经验,为你挑选了11个好方法。

我开始使用Python编写各种项目代码(包括Django Web开发和Panda3D游戏开发).

为了帮助我理解正在发生的事情,我想基本上"查看"Python对象内部以查看它们如何勾选 - 就像它们的方法和属性一样.

所以说我有一个Python对象,我需要打印出它的内容?这甚至可能吗?



1> Brandon E Ta..:

Python有一套强大的内省功能.

看看以下内置函数:

type()

dir()

id()

getattr()

hasattr()

globals()

locals()

callable()

type()并且dir()分别对于检查对象的类型及其属性集特别有用.


不知道这个词是'内省'.这是一个很大的帮助!以及你给我的所有功能......谢谢!
我认为这是一个糟糕的答案.而不是给我们一个解决方案它只是给了我们与文档中的相关的一切
property,classmethod和staticmethod与内省无关.这些方法都创建了特殊类型的对象,可用于定义具有特殊行为的类,但在检查这些类或构造时没有任何帮助.

2> mtasic85..:

object.__dict__


为此使用了vars(object)。
实际上是从pprint导入pprint;pprint(vars(object))`给了我关于对象内容的非常漂亮的视图。谢谢@liberforce

3> S.Lott..:

首先,阅读来源.

其次,使用该dir()功能.


我会改变那个命令.
我不敢苟同.dir()的速度要快得多,在99%的情况下,你可以通过help()找到你需要的东西.
我同意通常无用.很多时候,对dir()的简单调用就足够了,从而省去了查看源代码的麻烦.
源代码比dir()更具信息性,并且有更好的发展习惯.
有时在运行时检查对象可能很有用,但读取源不是.例如httplib.py类及其方法:).

4> Jason Baker..:

我很惊讶没有人提到帮助!

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

帮助让您阅读文档字符串并了解类可能具有的属性,这非常有用.


如果该方法没有docstring,即没有文档,该怎么办?

5> Brian..:

如果这是为了探索发生了什么,我建议看看IPython.这会添加各种快捷方式来获取对象文档,属性甚至源代码.例如附加"?" 函数将为对象提供帮助(实际上是"help(obj)"的快捷方式,使用两个?'(" func??")的时候会显示源代码(如果可用).

还有许多额外的便利,例如标签完成,结果的漂亮打印,结果历史等,这使得这种探索性编程非常方便.

欲了解更多程序中使用内省的,像基本建宏dir(),vars(),getattr等将是有益的,但它是值得你花时间检查出的检查模块.要获取函数的源,请使用" inspect.getsource",例如,将其应用于自身:

>>> print inspect.getsource(inspect.getsource)
def getsource(object):
    """Return the text of the source code for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a single string.  An
    IOError is raised if the source code cannot be retrieved."""
    lines, lnum = getsourcelines(object)
    return string.join(lines, '')

inspect.getargspec 如果你正在处理包装或操作函数,它也经常有用,因为它将给出函数参数的名称和默认值.



6> titusjan..:

如果您对GUI感兴趣,请查看objbrowser.它使用Python标准库中的inspect模块进行下面的对象内省.

objbrowserscreenshot



7> bayer..:

您可以在shell中列出具有dir()的对象的属性:

>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

当然,还有检查模块:http://docs.python.org/library/inspect.html#module-inspect



8> erenon..:
"""Visit http://diveintopython.net/"""

__author__ = "Mark Pilgrim (mark@diveintopython.org)"


def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                     (method.ljust(spacing),
                      processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":
    print help.__doc__


如果你只是在打印周围添加parens,这在python 3中工作正常.

9> Ryan Bright..:

其他人已经提到了内置的dir()听起来像你正在寻找的,但这是另一个好的提示.许多库 - 包括大多数标准库 - 以源代码形式分发.这意味着你可以很容易地直接阅读源代码.诀窍是找到它; 例如:

>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'

编译*.pyc文件,因此删除尾随的'c'并在您喜欢的编辑器或文件查看器中打开未编译的*.py文件:

/usr/lib/python2.5/string.py

我发现这非常有用,可以发现从给定的API中引发异常的事情.Python世界中很少详细记录这种细节.



10> Symon..:

试试ppretty

from ppretty import ppretty


class A(object):
    s = 5

    def __init__(self):
        self._p = 8

    @property
    def foo(self):
        return range(10)


print ppretty(A(), indent='    ', depth=2, width=30, seq_length=6,
              show_protected=True, show_private=False, show_static=True,
              show_properties=True, show_address=True)

输出:

__main__.A at 0x1debd68L (
    _p = 8, 
    foo = [0, 1, 2, ..., 7, 8, 9], 
    s = 5
)



11> wp78de..:

虽然pprint其他人已经提到过,但我想添加一些背景信息.

pprint模块提供了一种"漂亮打印"任意Python数据结构的功能,该形式可用作解释器的输入.如果格式化结构包含非基本Python类型的对象,则表示可能无法加载.如果包含诸如文件,套接字,类或实例之类的对象,以及许多其他不能表示为Python常量的内置对象,则可能出现这种情况.

pprint可能是具有PHP背景的开发人员的高需求,他们正在寻找替代方案var_dump().

具有dict属性的对象可以使用pprint()mixed with 很好地转储vars(),它返回__dict__模块,类,实例等的属性:

from pprint import pprint
pprint(vars(your_object))

所以,不需要循环.

要转储全局局部范围中包含的所有变量,只需使用:

pprint(globals())
pprint(locals())

locals()显示函数中定义的变量.
除了其他用法之外,访问具有相应名称作为字符串键的函数也很有用:

locals()['foo']() # foo()
globals()['foo']() # foo()

同样,dir()用于查看模块的内容或对象的属性.

而且还有更多.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有