我开始使用Python编写各种项目的代码(包括Django web开发和Panda3D游戏开发)。
为了帮助我理解发生了什么,我想基本上“看看”Python对象内部,看看它们是如何运行的——比如它们的方法和属性。
假设我有一个Python对象,我需要什么来打印它的内容?这可能吗?
我开始使用Python编写各种项目的代码(包括Django web开发和Panda3D游戏开发)。
为了帮助我理解发生了什么,我想基本上“看看”Python对象内部,看看它们是如何运行的——比如它们的方法和属性。
假设我有一个Python对象,我需要什么来打印它的内容?这可能吗?
当前回答
其他人已经提到了dir()内置,这听起来像是您正在寻找的,但这里有另一个很好的提示。许多库——包括大多数标准库——都是以源代码形式发布的。这意味着您可以很容易地直接阅读源代码。诀窍在于找到它;例如:
>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
*。Pyc文件已编译,因此删除后面的'c',并在您最喜欢的编辑器或文件查看器中打开未编译的*.py文件:
/usr/lib/python2.5/string.py
我发现这对于发现从给定API引发哪些异常等事情非常有用。这种细节在Python世界中很少有良好的文档。
其他回答
已经有很多好的提示了,但还没有提到最短和最简单的(不一定是最好的):
object?
如果这是为了探究发生了什么,我建议查看IPython。这增加了获取对象文档、属性甚至源代码的各种快捷方式。例如,在函数后附加一个"?"将为对象提供帮助(有效地为"help(obj)"提供快捷方式),而使用两个"?" ("func??")将在可用时显示源代码。
还有很多额外的便利,如制表符补全、结果打印、结果历史记录等,这对于这种探索性编程非常方便。
对于内省的更多编程使用,基本的内置程序,如dir(), vars(), getattr等将是有用的,但值得您花时间检查inspect模块。要获取一个函数的源,使用inspect。例如,将其应用到自身:
>>> 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, '')
检查。如果处理包装或操作函数,Getargspec通常也很有用,因为它将给出函数参数的名称和默认值。
如果您正在寻找一个稍微更微妙的解决方案,您可以尝试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
>
>
首先,阅读原文。
其次,使用dir()函数。
如果你对此感兴趣,可以看看objbrowser。它使用Python标准库中的inspect模块进行下面的对象内省。