我正在尝试创建一个可与其他项目插入的导入语句。 该语句位于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'>
我怎样才能让后者工作?
最佳答案
那么您想要拥有与早期导入相关的导入语句吗?
这绝对是我曾经尝试过的东西。我有一些很长的导入语句,它们有一个共同的根源,所以我试图将其分解出来。我无法让它与直接导入语句一起工作,但也许我没有足够努力。
请记住,默认情况下导入语句的行为将创建一个模块对象。然后它会将其绑定(bind)到 sys.modules 中,然后使用 import 语句中的名称将其绑定(bind)到当前模块的命名空间中。请参阅http://docs.python.org/tutorial/modules.html .
模块对象有一个命名空间。如果模块不是包,则它的命名空间来自评估模块的 .py 文件的内容。但是,如果它是一个包,那么命名空间来自 __init__.py
包中的模块。包中的其他模块不会自动导入,并且在包的命名空间中不可用。您必须单独导入它们。
from...import 语句会将模块加载到 sys.modules 中。然后它会将对象从您在导入中引用的模块中拉出。最后,它使用 import 语句中的名称将该对象绑定(bind)到当前模块的 namespace 中。基本上,您是将绑定(bind)从一个命名空间复制到另一个命名空间。老实说,我发现当您稍后使用它时,它通常会混淆名称的来源(所以我不做太多)。
重点:
您对__import__
的使用是绕过 import 语句限制的一种方法。请参阅the python documentation 。但是,如果您使用 from..import 语句,请勿尝试重复使用 __import__
中的结果名称。除非它指向一个模块对象(它可能不是)。导入仅需要以点分隔的模块名称序列。
此外,请记住,仅进行显式导入可能是指示对象来自何处的更简洁的方法。
关于python - 如何让 'urlpatterns = __import__(<string_name>)' 像普通导入语句一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3586152/