1

我正在尝试创建一个可插入其他项目的导入语句。该语句位于 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'>

我怎样才能让后者工作?

4

2 回答 2

1

所以你想拥有相对于早期导入的导入语句?

绝对是我曾经尝试过的东西。我有一些很长的导入语句,它们有一个共同的根,所以我试图把它分解出来。我无法让它与直接导入语句一起工作,但也许我没有足够努力。

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

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

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

重点:

您的使用__import__是绕过导入语句限制的一种方法。请参阅python 文档。但是,如果您使用 from..import 语句,请不要尝试重用生成的名称,__import__除非它指向模块对象(它可能不是)。导入只需要一个以点分隔的模块名称序列。

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

于 2010-08-27T17:11:47.720 回答
0
urlpatterns = __import__(project_urls).whateversubmodule.urlpatterns
于 2010-08-27T16:17:52.123 回答