如何让'urlpatterns = __import __(<string_name>)'像普通的import语句一样工作?</string_name>

时间:2010-08-27 16:16:10

标签: python python-module python-import

我正在尝试创建一个可以与其他项目一起插入的import语句。 该声明位于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 个答案:

答案 0 :(得分:1)

所以你想拥有与早期导入相关的import语句?

绝对是我曾经尝试过的东西。我有一些很长的导入语句,它们有一个共同的根,所以我试图将它排除在外。我无法使用直接导入语句,但也许我没有努力。

请记住,默认情况下import语句行为将创建一个模块对象。然后它将它绑定到sys.modules中,然后使用import语句中的名称将其绑定到当前模块的命名空间中。请参阅http://docs.python.org/tutorial/modules.html

模块对象具有命名空间。如果模块不是包,则它的命名空间来自于评估模块的.py文件的内容。但是,如果它是一个包,则命名空间来自包中的__init__.py模块。包中的其他模块不会自动导入,并且在包的命名空间中不可用。你必须单独导入它们。

from ... import语句将模块加载到sys.modules中。然后它会将对象拉出导入中引用的模块。最后,它使用import语句中的名称将该对象绑定到当前模块的命名空间中。基本上,您将绑定从一个名称空间复制到另一个名称空间。说实话,我发现它在以后使用它时通常会混淆名称的来源(所以我做得不多)。

重点:

使用__import__是围绕import语句限制的一种方法。见the python documentation。但是,如果使用from..import语句,请不要尝试在__import__中重用结果名称,除非它指向模块对象(可能不是)。导入只需要以点分隔的模块名称序列。

同样,请记住,仅仅显示导入可能是一种更清晰的方式来指示对象来自何处。

答案 1 :(得分:0)

urlpatterns = __import__(project_urls).whateversubmodule.urlpatterns