Как мне заставить 'urlpatterns = __import __ (<string_name>)' работать как обычный оператор импорта? - PullRequest
1 голос
/ 27 августа 2010

Я пытаюсь создать оператор импорта, который подключается к другим проектам.Это утверждение находится в urls.py

Так что это работает:

from forum.urls import urlpatterns
# Base Class:   <type 'list'>

Но это не работает:

from settings import ROOT_URLCONF as project_urls
urlpatterns = __import__(project_urls)
# Base Class:   <type 'module'>

Как я могу получить последний дляработа

Ответы [ 2 ]

1 голос
/ 27 августа 2010

То есть вы хотите иметь операторы импорта, относящиеся к предыдущим импортам?

Определенно что-то, что я попробовал в одной точке.У меня было несколько очень длинных операторов импорта, имеющих общий корень, поэтому я постарался выделить их.Я не мог заставить его работать с прямыми операторами импорта, но, возможно, я не слишком старался.

Имейте в виду, что поведение оператора импорта по умолчанию будет создавать объект модуля.Затем он свяжет его с sys.modules, а затем свяжет его в пространстве имен вашего текущего модуля с именем из оператора import.См. http://docs.python.org/tutorial/modules.html.

Объект модуля имеет пространство имен.Если модуль не является пакетом, его пространство имен определяется оценкой содержимого файла .py модуля.Однако, если это пакет, то пространство имен происходит из модуля __init__.py в пакете.Другие модули в пакете не импортируются автоматически и недоступны в пространстве имен пакета.Вы должны импортировать их отдельно.

Оператор from ... import загрузит модуль в sys.modules.Затем он вытянет объект из того модуля, на который вы ссылались при импорте.Наконец, он связывает этот объект в пространство имен вашего текущего модуля с именем из оператора import.По сути, вы копируете привязку из одного пространства имен в другое.Честно говоря, я нахожу, что это обычно скрывает источник имени, когда вы используете его позже (поэтому я не делаю это много).

К вопросу:

Ваше использование __import__ - это способ обойти ограничения оператора импорта.Смотрите документацию по питону .Однако, если вы используете оператор from..import, не пытайтесь повторно использовать полученное имя в __import__, если только оно не указывает на объект модуля (что, вероятно, не так).Для импорта необходима только последовательность имен модулей, разделенных точками.

Также имейте в виду, что простое указание явного импорта может быть более понятным способом указать, откуда пришел объект.

0 голосов
/ 27 августа 2010
urlpatterns = __import__(project_urls).whateversubmodule.urlpatterns
...