1

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

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

    def __iter__(self):
        return self

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

当我们使用它时,如(for i in iteratorExample),解释器将调用 __iter__(self) 和 __next__(self) 方法。我的问题是:

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

2 回答 2

3

您可以查看 Python 字节码反汇编,了解for-loop 在 Python 中是如何实现的:

>>> 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 源代码库中看到它们。

内置方法来自在Python/bltinmodule.cbuiltins中实现的模块,例如,调用。len()PyObject_Size()

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


Python文件夹里不是CPython代码吗?

不,Python 安装文件夹不包含 CPython 的源代码。它可能包含来自标准库(例如Lib/fractions.py )的纯 Python 模块,除非它们被压缩或仅安装了编译模块(例如.pyc.pyo文件)。

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

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

Mercurial 可执行文件hg在哪里。

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

于 2014-12-28T13:17:08.110 回答
0

您要求的是 Python 内置的行为。特别是,您使用的是用 C 编写的 Python 解释器,通常称为 CPython。您可以在此处找到 CPython 的源代码,尽管需要一段时间才能找到确切的代码和迭代器协议len()int()

于 2014-12-28T13:14:23.980 回答