Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2009 16:13:51

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

Как сделать import * из под функции так чтобы все было видно снаружи?

Есть class A(), набор модулей с набором констант (имена констант совпадают).
После инициализации класса A становиться понятно какой набор констант нужен.
Что нужно:
После инициализации класса A все константы из заданного модуля должны быть глобально доступными.

Пробовал так:

s1.py
a = 7

s2.py
a =8

part.py
Class A()
__init__(self):
self.setup = <read from somewere>
exec “from %s import *” % self.setup
print a

где-то происходит
test.py
from part import *
A()
print a

По фигу что надо будет сделать в конструкторе класса A, но в test.py должна печататься переменная a.
Это вааще реально сделать?



Отредактировано (Авг. 7, 2009 16:14:06)

Офлайн

#2 Авг. 7, 2009 17:54:57

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

Как сделать import * из под функции так чтобы все было видно снаружи?

Шрифт – говно.

__init__(self):
#...
exec 'import %s as foo'%self.setup
for k, v in vars(foo).iteritems():
globals()[k] = v
#...
p.s. Не проверял.

..bw



Отредактировано (Авг. 7, 2009 17:56:17)

Офлайн

#3 Авг. 7, 2009 18:35:53

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

Как сделать import * из под функции так чтобы все было видно снаружи?

Что-то не совсем понятно: глобально доступные - это где?
Пример bw вставит в модуль, в котором лежит A.__init__
Т.е. в part.py
Можно словить фрейм, прыгнуть на 2? вверх и менять f_globals
Но тогда имена попадут только в тот модуль, который создавал A()
Запихнуть везде, где только можно - тоже выйдет, если захотеть.

Но оно надо?
В любом случае запрос звучит как сильное колдунство, которое может сильно и больно ударить в ответ.
Я бы писал

a = A()
print a.a
и не заморачивался. Явное лучше неявного.

P.S. В трудных случаях еще раз медитируем над Python Zen.



Отредактировано (Авг. 7, 2009 18:36:57)

Офлайн

#4 Авг. 7, 2009 22:26:52

sky
От:
Зарегистрирован: 2008-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сделать import * из под функции так чтобы все было видно снаружи?

почитай в документации про функцию __import__ ..
а лучше сделай класс например Data например и с его обьектов уже проводи такие манипуляции а не с глобальной областью видимости



Офлайн

#5 Авг. 11, 2009 11:51:20

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

Как сделать import * из под функции так чтобы все было видно снаружи?

Пасиба, bw!

Это реально помогло!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version