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