Я пытаюсь сделать __init__.py
этот модуль загрузки и создать экземпляр динамического внутреннего класса тезки. С деревом файлов, например
importer/
__init__.py # The file i'm writing
asd.py # It contains class asd
bsd.py # It contains class bsd
И __init__.py
с
importername=__name__
def load(modname,paramlist = []):
if modname in globals():
print 'Module %s already loaded.' % (modname)
else:
imported_mod = __import__(importername + '.' + modname, fromlist = ["*"])
try:
globals()[modname]=getattr(imported_mod,modname)(*paramlist)
except Exception, e:
print 'Module %s not loaded: %s.' % (modname, e)
Если я запустил
import importer
importer.load('asd')
print importer.asd.name
'ASD!'
Он работает как шарм, но если я запустил
from importer import *
load('asd')
print asd.name
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'asd' is not defined
Можно ли это исправить? Спасибо.
В Python нет такой вещи, как действительно глобальная. Когда вы используете globals() в importer/__init__.py
, вы получаете доступ к пространству имен модулей. Ваш второй нерабочий образец добавляет "asd" к импортеру, а не к вашему тестовому модулю.
Самое лучшее, что вы можете сделать, это изменить импортер, чтобы вы могли:
from importer import *
asd = load('asd')
print asd.name
Но, как предлагает Томас К: это довольно странно, возможно, есть более простой способ решить вашу проблему?