Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 26, 2010 16:58:43

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

храниние Python-кода в базе

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)

Офлайн

#2 Янв. 27, 2010 00:26:11

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

храниние Python-кода в базе

axe
ZZZ, по ссылке посмотрел первые три страницы. По-моему, к теме не очень относится.
Ну это типа шутка была… Там человек реально бредит.
И говорил я о том, что стоит ещё подумать об удучшении архитектуры, ибо это плохой подход.



Офлайн

#3 Янв. 27, 2010 09:03:08

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

храниние Python-кода в базе

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

..bw



Офлайн

#4 Янв. 27, 2010 09:21:48

clopomor
От:
Зарегистрирован: 2007-06-12
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

храниние Python-кода в базе

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



Офлайн

#5 Янв. 27, 2010 09:35:36

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

храниние Python-кода в базе

да, питон-апплеты были бы счастьем…

ZZZ, не буду спорить о том, что “вообще” этот подход плохой или хороший.
В моём случае он оправдан. Продукт пишу не я один, варианты обсуждали.



Офлайн

#6 Янв. 27, 2010 09:47:38

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

храниние Python-кода в базе

С PEP 302 все очень просто.
Делаем Finder по документу, совмещая его с Loader. Регистрируем в sys.path_hooks. Добавляем в sys.path что-нибудь эдакое вроде ‘database://database_uri’
В конструкторе Finder выбрасываем исключение, если он делается не для нашей схемы. Иначе устанавливаем соединение с БД, чтобы потом его использовать в find_module/load_module. imp не нужен - это средство для работы с импортами, а не создания их.
Как-то так. В самом документе все неплохо описано.



Офлайн

#7 Янв. 27, 2010 13:15:13

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

храниние Python-кода в базе

bw
классная абстракция получается
Хм… Интересно… А с учётом PEP 302 ещё и красиво, блин!
Надо будет попробовать с этим поработать…



Отредактировано (Янв. 27, 2010 13:15:37)

Офлайн

#8 Март 7, 2010 12:19:36

villager
От:
Зарегистрирован: 2008-11-04
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

храниние Python-кода в базе

я для похожих целей пока использую такую конструкцию
хочу еще отладчик прикрутить… как?

# -*- 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)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version