有没有办法查看python解释器中__enter __()函数背后的代码?

时间:2011-03-30 16:08:44

标签: python

问题几乎说明了一切。

我想以这种方式看代码:

>>>f = open("x.txt")
>>>print contents of f.__enter__() #<- how can I do this?

2 个答案:

答案 0 :(得分:3)

没有。 (除了查看Python源代码。)

>>> f = open("x.txt")
>>> f.__enter__
<built-in method __enter__ of file object at 0x022E4E90>

因此__enter__的实现位于Python的C代码中。

实际上在Objects/fileobject.c你可以找到in the Python source tree [注意:我认为这是2.7分支上目前最新的东西;可能有更好的方式链接到它]并查看您将看到的实际f.__enter__返回f本身的代码。当然,这就是在这种特殊情况下发生的事情;其他对象的__enter__方法会做完全不同的事情。

在这种情况下,__enter__方法是本机代码。在其他情况下,它可能是Python代码,但你仍然无法从Python内部看到它。

>>> import decimal
>>> decimal.localcontext().__enter__
<bound method _ContextManager.__enter__ of <decimal._ContextManager object at 0x02192B50>>

这是Python字节码而不是本机代码。你可以看到字节码:

import dis
dis.dis(decimal.localcontext().__enter__)

但不保证原始Python源代码可用。但你可以尝试:

import inspect
print inspect.getsource(decimal.localcontext().__enter__)

有时会做你想做的事。

答案 1 :(得分:1)

你不能,至少不能来自abritary callable(或任何其他)对象。您可以尝试查找源代码,在许多情况下甚至可以a function in the standard library执行此操作。但是,I / O模块可以用C编写,所以你必须去搜索repository