Найти - Пользователи
Полная версия: храниние Python-кода в базе
Начало » Python для экспертов » храниние Python-кода в базе
1 2
bw
exec можно делать без compile.

p.s. Опоздал :-).

p.p.s. Но я бы посоветовал обратить внимание на возможность создавать свои модули (hi = new.module('hi')) и выполнять этот код в пространстве имен такого модуля (exec ‘foo = “bar”’ in vars(hi)), а не в текущем. Хотя это зависит от задачи.

>>> print hi.foo
bar

..bw
ZZZ
axe
ZZZ, по ссылке посмотрел первые три страницы. По-моему, к теме не очень относится.
Ну это типа шутка была… Там человек реально бредит.
И говорил я о том, что стоит ещё подумать об удучшении архитектуры, ибо это плохой подход.
bw
> ибо это плохой подход.
Я таки не до конца понял, что требуется, но взгляни на ситуацию под таким углом.
Плохим подходом можно считать и хранение кода в файлах, сейчас объясню. Если мы делаем свой импортер (заменяя или дополняя существующие), то использование кода из РСУБД (или о какой там базе речь шла) возможно более чем традиционным методом (import hi, см. мой предыдущий пост про “hi”). Тогда как нафик разница импортирующему коду, где же на самом деле хранится код модуля (файл, сеть, архив, РБ, кеш и т.д., кстати, я делал про сеть такую замуту, замечательно такие системы поддерживаются, не нужно обновлять клиентов, они сами себя обновляют, даже не замечая этого ;-) и что он вообще из себя представляет, классная абстракция получается :-).

..bw
clopomor
пітон в деякій мірі аналог java. а там таке є, дивно що в пітоні іще цього не реалізували…
можна було б пітон-аплети також робити…
axe
да, питон-апплеты были бы счастьем…

ZZZ, не буду спорить о том, что “вообще” этот подход плохой или хороший.
В моём случае он оправдан. Продукт пишу не я один, варианты обсуждали.
Андрей Светлов
С PEP 302 все очень просто.
Делаем Finder по документу, совмещая его с Loader. Регистрируем в sys.path_hooks. Добавляем в sys.path что-нибудь эдакое вроде ‘database://database_uri’
В конструкторе Finder выбрасываем исключение, если он делается не для нашей схемы. Иначе устанавливаем соединение с БД, чтобы потом его использовать в find_module/load_module. imp не нужен - это средство для работы с импортами, а не создания их.
Как-то так. В самом документе все неплохо описано.
ZZZ
bw
классная абстракция получается
Хм… Интересно… А с учётом PEP 302 ещё и красиво, блин!
Надо будет попробовать с этим поработать…
villager
я для похожих целей пока использую такую конструкцию
хочу еще отладчик прикрутить… как?
# -*- coding: utf-8 -*-
import sys

def loader(code, mem):
RETURN=None
try:
exec code
except:
err=sys.exc_info()
errtxt=u""
RETURN=None
for x in err: errtxt+="%s" %x
print u"Ошибка при выполнении...\n%s\nТекст ошибки:\n %s" % (code, errtxt)
return RETURN

code1="""
RETURN=mem.a*mem.b
"""

code2="""
RETURN=mem.a-mem.b
"""

class mem1(): pass
class mem2(): pass

mem1.a=2
mem1.b=3

mem2.a=9
mem2.b=4

print loader(code1, mem1)
print loader(code2, mem1)
print loader(code1, mem2)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB