Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 13, 2008 13:43:47

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

хак импорта

Хочу сделать так, что импортировал модули, код которых лежит в БД. При этом не делая промежуточного сохранения на диск.
У кого нибудь есть идеи? =)



Офлайн

#2 Июнь 13, 2008 13:52:32

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

хак импорта

Попробовать `compile`, а потом его через `eval` пропустить. Так что с импортом будет не представляю:)



Офлайн

#3 Июнь 13, 2008 14:21:27

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

хак импорта

Вот мой вариант:>>> 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



Офлайн

#4 Июнь 13, 2008 14:24:04

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

хак импорта

ZAN
Вот мой вариант:
Любопытно. А как его импортировать через `import`? можно ли это сделать прозрачно для клиентского кода?



Офлайн

#5 Июнь 13, 2008 14:25:52

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

хак импорта

ZAN
О! отлично. Я как рза продирался сквозь дебри PEPa на эту тему. =)



Офлайн

#6 Июнь 13, 2008 14:29:43

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

хак импорта

а что означает
exec(source) in mod.__dict__
??



Офлайн

#7 Июнь 13, 2008 14:44:45

Andity
От:
Зарегистрирован: 2008-02-22
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

хак импорта

Кстати, какое вообще отличие eval() от exec



Офлайн

#8 Июнь 13, 2008 14:45:06

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

хак импорта

Daevaorn
Любопытно. А как его импортировать через `import`? можно ли это сделать прозрачно для клиентского кода?
Честно говоря, как изменить поведение import statement, не знаю. Врядли это вообще возможно.



Офлайн

#9 Июнь 13, 2008 14:49:56

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

хак импорта

shiza
а что означает
exec(source) in mod.__dict__
??
Просто есть возможность явно указать область видимости для динамического выполнения кода. Синтаксис такой:
exec(source) in scope, где scope - это просто словарь, либо dict-like объект. В данном случае все объекты, создаваемые в source, должны быть доступны, как атрибуты объекта-модуля mod. Поэтому scope в данном случае - mod.__dict__



Офлайн

#10 Июнь 13, 2008 14:52:43

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

хак импорта

ZAN
Честно говоря, как изменить поведение import statement, не знаю. Врядли это вообще возможно.
Как-то это точно можно сделать, например py2exe это реализует.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version