bw
Янв. 26, 2010 16:58:43
exec можно делать без compile.
p.s. Опоздал :-).
p.p.s. Но я бы посоветовал обратить внимание на возможность создавать свои модули (hi = new.module('hi')) и выполнять этот код в пространстве имен такого модуля (exec ‘foo = “bar”’ in vars(hi)), а не в текущем. Хотя это зависит от задачи.
>>> print hi.foo
bar
..bw
ZZZ
Янв. 27, 2010 00:26:11
axe
ZZZ, по ссылке посмотрел первые три страницы. По-моему, к теме не очень относится.
Ну это типа шутка была… Там человек реально бредит.
И говорил я о том, что стоит ещё подумать об удучшении архитектуры, ибо это плохой подход.
bw
Янв. 27, 2010 09:03:08
> ибо это плохой подход.
Я таки не до конца понял, что требуется, но взгляни на ситуацию под таким углом.
Плохим подходом можно считать и хранение кода в файлах, сейчас объясню. Если мы делаем свой импортер (заменяя или дополняя существующие), то использование кода из РСУБД (или о какой там базе речь шла) возможно более чем традиционным методом (import hi, см. мой предыдущий пост про “hi”). Тогда как нафик разница импортирующему коду, где же на самом деле хранится код модуля (файл, сеть, архив, РБ, кеш и т.д., кстати, я делал про сеть такую замуту, замечательно такие системы поддерживаются, не нужно обновлять клиентов, они сами себя обновляют, даже не замечая этого ;-) и что он вообще из себя представляет, классная абстракция получается :-).
..bw
clopomor
Янв. 27, 2010 09:21:48
пітон в деякій мірі аналог java. а там таке є, дивно що в пітоні іще цього не реалізували…
можна було б пітон-аплети також робити…
axe
Янв. 27, 2010 09:35:36
да, питон-апплеты были бы счастьем…
ZZZ, не буду спорить о том, что “вообще” этот подход плохой или хороший.
В моём случае он оправдан. Продукт пишу не я один, варианты обсуждали.
Андрей Светлов
Янв. 27, 2010 09:47:38
С PEP 302 все очень просто.
Делаем Finder по документу, совмещая его с Loader. Регистрируем в sys.path_hooks. Добавляем в sys.path что-нибудь эдакое вроде ‘database://database_uri’
В конструкторе Finder выбрасываем исключение, если он делается не для нашей схемы. Иначе устанавливаем соединение с БД, чтобы потом его использовать в find_module/load_module. imp не нужен - это средство для работы с импортами, а не создания их.
Как-то так. В самом документе все неплохо описано.
ZZZ
Янв. 27, 2010 13:15:13
bw
классная абстракция получается
Хм… Интересно… А с учётом PEP 302 ещё и красиво, блин!
Надо будет попробовать с этим поработать…
villager
Март 7, 2010 12:19:36
я для похожих целей пока использую такую конструкцию
хочу еще отладчик прикрутить… как?
# -*- 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)