Найти - Пользователи
Полная версия: хак импорта
Начало » Python для экспертов » хак импорта
1 2
shiza
Хочу сделать так, что импортировал модули, код которых лежит в БД. При этом не делая промежуточного сохранения на диск.
У кого нибудь есть идеи? =)
Александр Кошелев
Попробовать `compile`, а потом его через `eval` пропустить. Так что с импортом будет не представляю:)
ZAN
Вот мой вариант:>>> 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
Александр Кошелев
ZAN
Вот мой вариант:
Любопытно. А как его импортировать через `import`? можно ли это сделать прозрачно для клиентского кода?
shiza
ZAN
О! отлично. Я как рза продирался сквозь дебри PEPa на эту тему. =)
shiza
а что означает
exec(source) in mod.__dict__
??
Andity
Кстати, какое вообще отличие eval() от exec
ZAN
Daevaorn
Любопытно. А как его импортировать через `import`? можно ли это сделать прозрачно для клиентского кода?
Честно говоря, как изменить поведение import statement, не знаю. Врядли это вообще возможно.
ZAN
shiza
а что означает
exec(source) in mod.__dict__
??
Просто есть возможность явно указать область видимости для динамического выполнения кода. Синтаксис такой:
exec(source) in scope, где scope - это просто словарь, либо dict-like объект. В данном случае все объекты, создаваемые в source, должны быть доступны, как атрибуты объекта-модуля mod. Поэтому scope в данном случае - mod.__dict__
Viper
ZAN
Честно говоря, как изменить поведение import statement, не знаю. Врядли это вообще возможно.
Как-то это точно можно сделать, например py2exe это реализует.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB