Python3解释器中方法和类的位置

时间:2014-12-28 13:04:54

标签: python interpreter language-implementation

我们的教授今天告诉我们,我们可以建立一个迭代器,例如

class IteratorExample:
    def __init__(self, n):
       pass

    def __iter__(self):
        return self

    def __next__(self):
        if cond:
            pass
        else:
            raise StopIteration

并且当我们将使用它时,如(在iteratorExample中为i),解释器将调用__iter __(self)和__next __(self)方法。我的问题是:

  1. 如果我打开C:\ Python文件夹 - 我在哪里可以看到调用这些方法的代码?
  2. 在python文件夹中,我在哪里可以看到其他内置方法的代码(如len()或int()?

2 个答案:

答案 0 :(得分:2)

你可以查看Python字节码反汇编,看看如何在Python中实现for - 循环:

>>> import dis
>>> dis.dis('for x in it: pass')
  1           0 SETUP_LOOP              14 (to 17)
              3 LOAD_NAME                0 (it)
              6 GET_ITER
        >>    7 FOR_ITER                 6 (to 16)
             10 STORE_NAME               1 (x)
             13 JUMP_ABSOLUTE            7
        >>   16 POP_BLOCK
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE

即使没有查看来源,我们也可以猜到__iter__操作码会调用GET_ITER__next__会调用FOR_ITER

事实上,CPython的Python/ceval.c确认了它,例如,GET_ITER调用PyObject_GetIter(iterable)等同于iter(iterable),可以调用iterable.__iter__()方法。


  

在python文件夹中,我在哪里可以看到其他内置方法的代码(如len()或int()?

这些功能也在C(在CPython中)中实现。您可以在CPython source repository

中查看它们

内置方法来自builtins模块,该模块在Python/bltinmodule.c e.g., len()次调用PyObject_Size()中实施。

int是Python中的整数类。它在Objects/longobject.c(Python 3)中实现。


  

不是Python文件夹中的CPython代码吗?

没有。 Python安装文件夹不包含CPython的源代码。它可能包含标准库中的纯Python模块,例如Lib/fractions.py,除非它们是压缩的,或者只安装了.pyc.pyo文件等编译模块。

要获取完整的源代码,请运行:

$ hg clone https://hg.python.org/cpython

其中hgMercurial executable

作为练习,您可以找到其他Python implementations的位置,例如Pypy,Jython定义GET_ITERFOR_ITERlen()int()

答案 1 :(得分:0)

您要求内置于Python中的行为。特别是你使用的是用C语言编写的Python解释器,通常称为CPython。你可以找到CPython here的源代码,虽然它需要一段时间才能找到执行len()int()和迭代器协议的确切代码。