shiza
Июнь 13, 2008 13:43:47
Хочу сделать так, что импортировал модули, код которых лежит в БД. При этом не делая промежуточного сохранения на диск.
У кого нибудь есть идеи? =)
Александр Кошелев
Июнь 13, 2008 13:52:32
Попробовать `compile`, а потом его через `eval` пропустить. Так что с импортом будет не представляю:)
ZAN
Июнь 13, 2008 14:21:27
Вот мой вариант:>>> import imp
>>> def dynamic_mod(mod_name, source):
mod = imp.new_module(mod_name)
exec(source) in mod.__dict__
return mod
>>> source = ‘'’
import this
a = 1
b = 2'''
>>> my_mod = dynamic_mod('my_mod', source)
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
…
>>> my_mod.a
1
Александр Кошелев
Июнь 13, 2008 14:24:04
ZAN
Вот мой вариант:
Любопытно. А как его импортировать через `import`? можно ли это сделать прозрачно для клиентского кода?
shiza
Июнь 13, 2008 14:25:52
ZAN
О! отлично. Я как рза продирался сквозь дебри PEPa на эту тему. =)
shiza
Июнь 13, 2008 14:29:43
а что означает
exec(source) in mod.__dict__
??
Andity
Июнь 13, 2008 14:44:45
Кстати, какое вообще отличие eval() от exec
ZAN
Июнь 13, 2008 14:45:06
Daevaorn
Любопытно. А как его импортировать через `import`? можно ли это сделать прозрачно для клиентского кода?
Честно говоря, как изменить поведение import statement, не знаю. Врядли это вообще возможно.
ZAN
Июнь 13, 2008 14:49:56
shiza
а что означает
exec(source) in mod.__dict__
??
Просто есть возможность явно указать область видимости для динамического выполнения кода. Синтаксис такой:
exec(source) in scope, где scope - это просто словарь, либо dict-like объект. В данном случае все объекты, создаваемые в source, должны быть доступны, как атрибуты объекта-модуля mod. Поэтому scope в данном случае - mod.__dict__
Viper
Июнь 13, 2008 14:52:43
ZAN
Честно говоря, как изменить поведение import statement, не знаю. Врядли это вообще возможно.
Как-то это точно можно сделать, например py2exe это реализует.