Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 26, 2010 13:36:44

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

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

Есть некоторые сущности, с которыми должны быть связаны функции проверки. Функции должны быть написаны на Python (т.к. будут запускаться в Python), содержимое функций должно храниться в базе, вместе с соответствующими сущностями.

Мне надо придумать способ, как эти функции хранить, создавать и отлаживать.

eval при попытке создания функции через def ругается.



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

Офлайн

#2 Янв. 26, 2010 13:56:24

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

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

Первая мысль - сделать классы-проверщики и хранить их с помощью pickle.

P.S.
Для этого можно также посмотреть в коде фреймворка Zope2, там где-то используется хранение участков кода для последующего выполнения.

P.P.S.
А eval ругается потому что он не умеет, и нужно использовать exec. Хотя я, к примеру, такие аццкие хаки не люблю…



Отредактировано (Янв. 26, 2010 13:57:38)

Офлайн

#3 Янв. 26, 2010 14:19:58

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

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

PEP 302. Хранить - хоть в текстовом питоновском виде. Организовав кеш получившихся codeobject для скорости, если нужно (как питон делает с .py -> .pyc)
Отлаживать - еще проще. На время отладки подставлять файлы на диске, а в production эту дыру отключать.



Офлайн

#4 Янв. 26, 2010 14:30:13

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

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

Был тут один… Зачёса
Пишет “симулятор всего”, пытаясь запихать весь игромех (вместе логикой, конечно) в реляцию.
Смотреть тут: http://www.elite-games.ru/conference/viewtopic.php?t=43530

P.S. Только мозг от этого “креатива” не сломайте.



Офлайн

#5 Янв. 26, 2010 14:45:57

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

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

А, это тот который на нашем форуме агитировал с ним делать вселенную будущего? =)) ыыы



Офлайн

#6 Янв. 26, 2010 15:06:49

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

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

Ага… Редкий человек… Гений! Никто не понимает, того, что он хочет сделать! Даже Он сам. :-D



Офлайн

#7 Янв. 26, 2010 15:22:23

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

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

Андрей, я пробую читать по инету про PEP302, но пока не могу разобраться. Есть и ограничения в знании английского, и до Вашего уровня в python мне очень далеко. Если можно, ответьте чуть более подробно?
Видимо, надо копать в сторону модуля imp?

ZZZ, по ссылке посмотрел первые три страницы. По-моему, к теме не очень относится. Просмотреть все 58 страниц обсуждения не могу, т.к. ограничение трафика на рабочем месте. Может быть вечером взгляну.



Офлайн

#8 Янв. 26, 2010 15:39:19

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

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

> eval при попытке создания функции через def ругается.
> и нужно использовать exec
__builtins__.compile(…) ?

Можно хранить (и при необходимости выполнять) и байт-код, но нужно следить за версией Python (в какой был этот код создан и в какой сейчас будет интерпретироваться). Я так поступал в детстве.

p.s. Хотя я не понял что требуется, наугад сказал :-).

..bw



Офлайн

#9 Янв. 26, 2010 16:36:39

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

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

получается следующее:

BODY = """
class m(object):
z = []
def __init__(self):
pass

def hello():
print "hello"
"""
exec(compile(BODY, "<string>", "exec"))
hello()
print dir(m())



Офлайн

#10 Янв. 26, 2010 16:48:55

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

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

видимо и без compile всё работает:

exec("""
def hello():
print "hello"
""")
hello()



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version