python - 如何让 'urlpatterns = __import__(<string_name>)' 像普通导入语句一样工作?

标签 python python-module python-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'>

我怎样才能让后者工作?

最佳答案

那么您想要拥有与早期导入相关的导入语句吗?

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

请记住,默认情况下导入语句的行为将创建一个模块对象。然后它会将其绑定(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/

相关文章:

python - 使用 praw 解析评论时遇到问题

Python:展平函数在控制台中有效但在文件中无效?

python - python-django 应用程序中的相对导入不起作用

python - 从父目录中的python模块导入子目录中的jupyter笔记本文件

python - 模块 'shapely' 没有属性 'geometry' 错误

python - 无法使用顶级模块(源文件夹)启动我的导入语句

python - 使用 python 创建 cassandra db 用户/角色

python - 为什么我的 exe 文件不遵循脚本中的指定路径?

python - Python Flask 中的相对导入似乎不起作用

python c api创建一个python模块