Проблемы при загрузке динамического модуля Python с использованием __init__.py

1

Я пытаюсь сделать __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

Можно ли это исправить? Спасибо.

  • 0
    Динамическое обновление глобальных переменных считается плохой практикой в Python. Что вы на самом деле хотите это для? Там, наверное, лучший способ.
  • 0
    Посмотрите на мой комментарий в ответе Неда.
Теги:
module
init
instantiation
loading

1 ответ

1
Лучший ответ

В Python нет такой вещи, как действительно глобальная. Когда вы используете globals() в importer/__init__.py, вы получаете доступ к пространству имен модулей. Ваш второй нерабочий образец добавляет "asd" к импортеру, а не к вашему тестовому модулю.

Самое лучшее, что вы можете сделать, это изменить импортер, чтобы вы могли:

from importer import *
asd = load('asd')
print asd.name

Но, как предлагает Томас К: это довольно странно, возможно, есть более простой способ решить вашу проблему?

  • 0
    Мне нужен своего рода набор одноэлементных классов, динамически загружаемых и доступных в каждой части программы, например, как предложение оператора import.
  • 0
    @ Emilio: Хм, это не проясняет, по крайней мере для меня. Какую проблему вы на самом деле пытаетесь решить?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню