我如何查看Python对象?

lit*_*m84 266 python introspection

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

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

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

Bra*_*lor 321

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

看看以下内置函数:

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

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

mta*_*c85 163

object.__dict__

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

S.L*_*ott 60

首先,阅读来源.

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

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

Jas*_*ker 53

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

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

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

foo()
    foo!
Run Code Online (Sandbox Code Playgroud)

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

  • 如果该方法没有docstring,即没有文档,该怎么办? (6认同)

Bri*_*ian 27

如果这是为了探索发生了什么,我建议看看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, '')
Run Code Online (Sandbox Code Playgroud)

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


tit*_*jan 15

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

objbrowserscreenshot


bay*_*yer 9

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

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

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


0x9*_*x90 9

有一个非常酷的工具,叫做objexplore. 这是一个关于如何explore在 pandas DataFrame 上使用其函数的简单示例。

import pandas as pd
df=pd.read_csv('https://storage.googleapis.com/download.tensorflow.org/data/heart.csv')

from objexplore import explore
explore(df)
Run Code Online (Sandbox Code Playgroud)

将在您的 shell 中弹出以下内容: 在此输入图像描述

  • 真的很酷有用的东西!有没有办法在 Jupyter Notebook 中与其交互? (2认同)

ere*_*non 8

"""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__
Run Code Online (Sandbox Code Playgroud)

  • 如果你只是在打印周围添加parens,这在python 3中工作正常. (4认同)

Rya*_*ght 7

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

>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
Run Code Online (Sandbox Code Playgroud)

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

/usr/lib/python2.5/string.py
Run Code Online (Sandbox Code Playgroud)

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


Sym*_*mon 7

试试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)
Run Code Online (Sandbox Code Playgroud)

输出:

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


wp7*_*8de 7

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

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

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

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

from pprint import pprint
pprint(vars(your_object))
Run Code Online (Sandbox Code Playgroud)

所以,不需要循环.

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

pprint(globals())
pprint(locals())
Run Code Online (Sandbox Code Playgroud)

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

locals()['foo']() # foo()
globals()['foo']() # foo()
Run Code Online (Sandbox Code Playgroud)

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

而且还有更多.


frm*_*ryr 5

检查代码的两个很棒的工具是:

  1. Python。一个 python 终端,允许您使用制表符补全进行检查。

  2. 带有PyDev 插件的Eclipse。它有一个出色的调试器,允许您在给定位置中断并通过以树形式浏览所有变量来检查对象。您甚至可以使用嵌入式终端在该位置尝试代码或键入对象并按“。” 让它为您提供代码提示。

在此输入图像描述