Вы можете посмотреть дизассемблирование байтового кода на 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__()
метод.
В папке питона, где я могу увидеть код других встроенных методов (например, LEN(), или INT()?
Эти функции также реализованы в C (в CPython). Вы можете увидеть их в CPython source repository.
Встроенные методы из builtins
модуля, который реализуется в Python/bltinmodule.c e.g., len()
вызовов PyObject_Size()
.
int
- класс для целых чисел в Python. Он реализован в Objects/longobject.c (Python 3).
Не код CPython в папке Python?
№ Папка установки Python не содержит исходный код для CPython. Он может содержать чистые модули Python из стандартной библиотеки, такие как Lib/fractions.py, если они не были заархивированы или не были только скомпилированные модули, такие как .pyc
, .pyo
файлов.
Чтобы получить полный исходный код, запустите:
$ hg clone https://hg.python.org/cpython
где hg
является Mercurial executable.
В качестве упражнения, вы могли бы найти, где другие Python implementations такие как PyPy, Jython определить GET_ITER
, FOR_ITER
, len()
, int()
.
Лучше спросите об этом свой проф :) – GLHF
Что вы имеете в виду, см. Код, который называет эти методы? * Вам нужно написать этот код. –
Я сделал, он сказал мне, что не уверен :-) а также, что интерпретатор для python написан на Python .. – blz