Как Пони (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 на лету.
Я все еще хотел бы видеть, что кто-то объясняет это, источник далеко вне моего уровня волшебства.