333

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

为了帮助我理解发生了什么,我想基本上“查看” Python 对象内部,看看它们是如何运行的——比如它们的方法和属性。

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

4

25 回答 25

393

Python 具有一组强大的自省功能。

看看以下内置函数

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

于 2009-06-17T10:28:53.627 回答
202

object.__dict__

于 2009-06-17T13:43:33.097 回答
79

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

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

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

foo()
    foo!

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

于 2009-06-18T00:11:32.043 回答
67

首先,阅读源码。

二是使用dir()功能。

于 2009-06-17T10:18:01.310 回答
30

如果这是为了探索以了解发生了什么,我建议您查看IPython。这添加了各种快捷方式来获取对象文档、属性甚至源代码。例如附加一个“?” 到函数将为对象提供帮助(实际上是“帮助(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如果您正在处理包装或操作函数,它也经常有用,因为它会给出函数参数的名称和默认值。

于 2009-06-17T13:41:07.733 回答
24

如果您对此 GUI 感兴趣,请查看objbrowser。它使用 Python 标准库中的检查模块进行对象自省。

objbrowserscreenshot

于 2014-04-18T00:30:26.953 回答
12

您可以在 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

于 2009-06-17T10:18:57.160 回答
12

试试漂亮

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
)
于 2016-07-28T07:07:06.363 回答
9

虽然pprint其他人已经提到过,但我想添加一些上下文。

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

pprint具有 PHP 背景且正在寻找var_dump().

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

from pprint import pprint
pprint(vars(your_object))

所以,不需要循环

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

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

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

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

类似地,dir()用于查看模块的内容,或对象的属性。

还有更多。

于 2018-04-05T05:27:07.570 回答
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__
于 2009-06-17T10:21:29.197 回答
7

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

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

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

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

我发现这对于发现诸如从给定 API 引发的异常之类的事情非常有用。这种细节在 Python 世界中很少有很好的记录。

于 2009-06-18T00:05:15.240 回答
5

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

  1. 蟒蛇。一个 python 终端,允许您使用制表符完成进行检查。

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

在此处输入图像描述

于 2016-09-16T13:17:28.720 回答
4

如果您想查看参数和方法,正如其他人指出的那样,您可以使用pprintdir()

如果你想查看内容的实际值,你可以这样做

object.__dict__

于 2009-06-17T12:01:45.627 回答
3

pprint 和 dir 一起工作得很好

于 2009-06-17T10:59:08.887 回答
3

为此目的构建了一个 python 代码库:introduced in Python 2.7

于 2014-03-06T20:12:04.390 回答
3

在 Python 3.8 中,您可以使用__dict__. 例如,

class Person():
   pass

person = Person()

## set attributes
person.first = 'Oyinda'
person.last = 'David'

## to see the content of the object
print(person.__dict__)  

{"first": "Oyinda", "last": "David"}
于 2021-01-07T02:54:24.113 回答
3

如果您有兴趣查看该对象对应的函数的源代码myobj,可以输入iPythonJupyter Notebook

myobj??

于 2018-05-16T21:23:02.633 回答
2

如果您正在寻找更微妙的解决方案,您可以尝试objprint。它的一个积极方面是它可以处理嵌套对象。例如:

from objprint import objprint

class Position:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Player:
    def __init__(self):
        self.name = "Alice"
        self.age = 18
        self.items = ["axe", "armor"]
        self.coins = {"gold": 1, "silver": 33, "bronze": 57}
        self.position = Position(3, 5)

objprint(Player())

会打印出来

<Player
  .name = 'Alice',
  .age = 18,
  .items = ['axe', 'armor'],
  .coins = {'gold': 1, 'silver': 33, 'bronze': 57},
  .position = <Position
    .x = 3,
    .y = 5
  >
>
于 2021-03-10T06:18:27.273 回答
2
import pprint

pprint.pprint(obj.__dict__)

或者

pprint.pprint(vars(obj))
于 2018-04-05T00:27:51.400 回答
1

如果您想查看活动对象内部,那么 python 的inspect模块是一个很好的答案。通常,它用于获取在磁盘上某个源文件中定义的函数的源代码。如果要获取解释器中定义的实时函数和 lambda 的源代码,可以使用dill.source.getsourcefrom dill。它还可以从 curries 中定义的绑定或未绑定的类方法和函数中获取代码……但是,如果没有封闭对象的代码,您可能无法编译该代码。

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 
于 2014-01-24T18:11:51.750 回答
1

有一个很酷的工具叫做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)

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

于 2021-09-28T10:39:40.717 回答
1

vars(obj)返回对象的属性。

于 2017-12-09T16:14:25.317 回答
0

另外,如果你想查看列表和字典,你可以使用 pprint()

于 2009-06-17T10:57:20.450 回答
-1

已经有很多好的提示,但是最短和最简单的(不一定是最好的)还有待提及:

object?
于 2020-06-12T11:26:36.780 回答
-5

尝试使用:

print(object.stringify())
  • object您要检查的对象的变量名称在哪里。

这会打印出格式良好且选项卡式的输出,显示对象中键和值的所有层次结构。

注意:这适用于 python3。不确定它是否适用于早期版本

更新:这不适用于所有类型的对象。如果您遇到其中一种类型(如 Request 对象),请改用以下类型之一:

  • dir(object())

或者

import pprint 然后: pprint.pprint(object.__dict__)

于 2018-05-03T21:58:08.790 回答