Как Пони (ORM) делает свои трюки?

Пони ОРМ делает хороший трюк преобразования выражения генератора в SQL. Пример:

>>> select(p for p in Person if p.name.startswith('Paul'))
        .order_by(Person.name)[:2]

SELECT "p"."id", "p"."name", "p"."age"
FROM "Person" "p"
WHERE "p"."name" LIKE "Paul%"
ORDER BY "p"."name"
LIMIT 2

[Person[3], Person[1]]
>>>

Я знаю, что в Python есть замечательная встроенная интроспекция и метапрограммирование, но как эта библиотека способна переводить выражение генератора без предварительной обработки? Это похоже на магию.

[Обновить]

Блендер написал:

Вот файл что тыпосле. Кажется, чтобы восстановить генератор с помощью некоторого волшебства самоанализа. Я'я не уверен, поддерживает ли он 100% PythonСинтаксис, но это довольно круто. - смеситель

Я думал, что они изучают какую-то особенность из протокола выражения генератора, но смотрели этот файл и виделиast модуль задействован ... Нет, они не проверяют источник программы на лету, не так ли? Умопомрачительных ...

@BrenBarn: если я попытаюсь вызвать генератор за пределамиselect вызов функции, результат:

>>> x = (p for p in Person if p.age > 20)
>>> x.next()
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
  File "C:\Python27\lib\site-packages\pony\orm\core.py", line 1822, in next
    % self.entity.__name__)
  File "C:\Python27\lib\site-packages\pony\utils.py", line 92, in throw
    raise exc
TypeError: Use select(...) function or Person.select(...) method for iteration
>>>

Похоже, они делают больше тайных заклинаний, таких как проверкаselect вызов функции и обработка дерева грамматики абстрактного синтаксиса Python на лету.

Я все еще хотел бы видеть, что кто-то объясняет это, источник далеко вне моего уровня волшебства.

Ответы на вопрос(1)

Ваш ответ на вопрос