Найти - Пользователи
Полная версия: Как сделать import * из под функции так чтобы все было видно снаружи?
Начало » Python для экспертов » Как сделать import * из под функции так чтобы все было видно снаружи?
1
shupg
Есть 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.
Это вааще реально сделать?
bw
Шрифт – говно.
__init__(self):
#...
exec 'import %s as foo'%self.setup
for k, v in vars(foo).iteritems():
globals()[k] = v
#...
p.s. Не проверял.

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

Но оно надо?
В любом случае запрос звучит как сильное колдунство, которое может сильно и больно ударить в ответ.
Я бы писал
a = A()
print a.a
и не заморачивался. Явное лучше неявного.

P.S. В трудных случаях еще раз медитируем над Python Zen.
sky
почитай в документации про функцию __import__ ..
а лучше сделай класс например Data например и с его обьектов уже проводи такие манипуляции а не с глобальной областью видимости
shupg
Пасиба, bw!

Это реально помогло!
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