问题几乎说明了一切。
我想以这种方式看代码:
>>>f = open("x.txt")
>>>print contents of f.__enter__() #<- how can I do this?
答案 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。