2014-12-28 2 views
1

Наш профессор сказал нам сегодня, что мы можем построить итератор, например.Расположение методов и классов в интерпретаторе Python3

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

    def __iter__(self): 
     return self 

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

и что, когда мы будем использовать его, как и в (для я в iteratorExample), интерпретатор будет вызывать __iter __ (самость) и __next __ (самостоятельно) методов. Мои вопросы:

  1. Если я открываю папку C: \ Python - где я могу увидеть код, который вызывает эти методы?
  2. В папке питона, где я могу увидеть код других встроенных методов (например, LEN(), или INT()?
+0

Лучше спросите об этом свой проф :) – GLHF

+2

Что вы имеете в виду, см. Код, который называет эти методы? * Вам нужно написать этот код. –

+0

Я сделал, он сказал мне, что не уверен :-) а также, что интерпретатор для python написан на Python .. – blz

ответ

2

Вы можете посмотреть дизассемблирование байтового кода на 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().

+0

Вау! Спасибо за попытку. Еще одна проблема - когда я ищу (с Windows Grep, а не из-за Пней Windows Search) мою папку C: \ Python34, например, выражение 'builtin_len' или для 'GET_ITER', которое используется в скрипте CPython, поиск не возвращает результатов. Не является ли код CPython в папке Python? Нотабене конечно, я загрузил Python с сайта www.python.org, и я использую последнюю версию – blz

+0

@ J.F.Sebastian за этот широкий ответ – Jivan

0

Вы просите поведения, встроенных в Python. В частности, вы используете интерпретатор Python, написанный на C, который часто упоминается как CPython. Вы можете найти источник CPython here, хотя для нахождения точного кода, который делает len(), int() и протокола итератора, вы можете найти