我试图使用__import__
函数复制from foo.bar import object
,但我似乎遇到了问题。
一个简单的例子from glob import glob
很简单:glob = __import__("glob").glob
我遇到的问题是,我正在从子包导入一个名称(即from foo.bar
):
所以我想要的是
string_to_import = "bar"
object = __import__("foo." + string_to_import).object
但这只是导入了顶级的foo
包,而不是foo.bar
子包:
__import__("foo.bar")
<module 'foo' from 'foo/__init__.pyc'>
有两种用途:
大部分情况下,你也不需要这么做。
用于用户空间导入
最佳实践是改用
importlib
。但如果你坚持:一般用法:
复杂:
如果需要名称中最右边的子模块,请将非空列表(例如
[None]
)传递给fromlist
:或者,如文档所述,使用
importlib.import_module
:文件
__import__
的文档是最令人困惑的内置函数。如果您仔细阅读它,就会感觉到API最初的目的是允许从模块延迟加载函数。然而,这不是CPython的工作方式,我不知道是否有其他Python实现成功做到了这一点。
相反,CPython在第一次导入时执行模块名称空间中的所有代码,然后将模块缓存在
sys.modules
中。__import__
仍然有用。但是基于文档理解它的功能是相当困难的。完全使用
__import__
为了调整全部功能以演示当前的
__import__
API,这里有一个包装函数,它有一个更干净、更具文档记录的API。要演示,例如从姐妹套餐到baz:
动态访问模块中的名称
要按名称从baz模块动态访问globals,请使用
getattr
。例如:挂钩以更改导入行为
您可以使用
__import__
来更改或拦截导入行为。在这种情况下,我们只需打印它得到的参数来演示我们正在拦截它:现在,当您导入时,您可以看到这些重要的参数。
在这种情况下,获取全局或局部可能会很有用,但不会立即想到这方面的具体用途。
__import__
函数将返回包的顶层模块,除非传递非空的fromlist
参数:请参阅^{} function 上的Python文档。
您应该使用
importlib.import_module
,不建议在解释器外部使用__import__
。在
__import__
的docstring中:它还支持relative imports。
相关问题 更多 >
编程相关推荐