- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 Python 中,如果你想以编程方式导入模块,你可以这样做:
module = __import__('module_name')
如果你想导入一个子模块,你会认为这很简单:
module = __import__('module_name.submodule')
当然,这是行不通的;您只需再次获得 module_name
。你必须这样做:
module = __import__('module_name.submodule', fromlist=['blah'])
为什么? fromlist
的实际值似乎根本不重要,只要它不为空。要求一个参数,然后忽略它的值有什么意义?
Python 中的大多数东西似乎都是有充分理由的,但就我的一生而言,我无法为这种行为的存在提出任何合理的解释。
最佳答案
其实__import__()
的行为完全是因为调用了__import__()
的import
语句的实现。 import
调用 __import__()
基本上有五种略有不同的方式(主要有两个类别):
import pkg
import pkg.mod
from pkg import mod, mod2
from pkg.mod import func, func2
from pkg.mod import submod
在第一种和第二种情况下,import
语句应该将“最左边”的模块对象分配给“最左边”的名称:包
。在 import pkg.mod
之后你可以做 pkg.mod.func()
因为 import
语句引入了本地名称 pkg
,它是一个具有 mod
属性的模块对象。因此,__import__()
函数必须返回“最左边”的模块对象,以便将其分配给 pkg
。因此,这两个 import 语句转换为:
pkg = __import__('pkg')
pkg = __import__('pkg.mod')
在第三种、第四种和第五种情况下,import
语句必须做更多的工作:它必须分配(可能)多个名称,这些名称必须从模块对象中获取。 __import__()
函数只能返回一个对象,并且没有真正的理由让它从模块对象中检索每个名称(这会使实现变得更加复杂。)所以简单的方法类似于(对于第三种情况):
tmp = __import__('pkg')
mod = tmp.mod
mod2 = tmp.mod2
但是,如果 pkg
是一个包,并且 mod
或 mod2
是该包中的模块 尚未导入,因为它们在第三种和第五种情况下。 __import__()
函数需要知道 mod
和 mod2
是 import
语句想要拥有的名称可访问,以便它可以查看它们是否是模块并尝试导入它们。所以调用更接近:
tmp = __import__('pkg', fromlist=['mod', 'mod2'])
mod = tmp.mod
mod2 = tmp.mod2
这会导致 __import__()
尝试加载 pkg.mod
和 pkg.mod2
以及 pkg
(但如果 mod
或 mod2
不存在,则在 __import__()
调用中不是错误;产生错误留给import
语句。)但这仍然不是第四个和第五个示例的正确方法,因为如果调用是这样的:
tmp = __import__('pkg.mod', fromlist=['submod'])
submod = tmp.submod
然后 tmp
最终会像以前一样成为 pkg
,而不是您想要获取 的
属性来自。实现可能已经决定这样做,所以 pkg.mod
模块submodimport
语句做了额外的工作,在 .
上拆分包名称,就像 __import__()
函数一样确实并遍历名称,但这意味着重复一些工作。因此,相反,实现使 __import__()
返回 right-most 模块而不是 left-most 一个 if and only如果 fromlist 已通过且不为空。
(import pkg as p
和 from pkg import mod as m
语法不会改变这个故事的任何内容,除了分配给哪些本地名称 - __import__()
函数在使用 as
时没有什么不同,它都保留在 import
语句实现中。)
关于python - 为什么 Python 的 __import__ 需要 fromlist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2724260/
我现在正在尝试编码挑战。我之前无法更改代码del __builtins__.__dict__["__import__"] 但之后必须使用 import。我需要一种方法来恢复默认的 __builtins
这是我检查__import__()性能的地方 In [9]: %%timeit ...: math = __import__('math') ...: sqrt = math.sqrt
Python 允许使用别名导入,通过 ...as import 语句中的子句,如下所示: import mymodule as somealias from myothermodule import
假设我有一个包含以下文件的模块包。一个空文件 C:\codes\package\__init__.py 和一些重要文件: 一个位于C:\codes\package\first.py def f():
这个问题在这里已经有了答案: How can I import a module dynamically given its name as string? (10 个答案) 关闭 9 年前。 我在
我正在尝试导入一个模块,同时传递一些全局变量,但它似乎不起作用: 文件 test_1: test_2 = __import__("test_2", {"testvar": 1}) 文件 test_2:
__import__() 函数用于动态加载类和函数 。 如果一个模块经常变化就可以使用 __import__() 来动态载入。 语法 __import__ 语法: __import__(na
我正在尝试编写一些能够抵抗 __import__ 被更改的代码,因为 the Pydev debugger overrides __import__ . 所以,我需要一种访问内置 __import__
我的目录结构是这样的: |- project |- commands.py |- Modules | |- __init__.py | |- base.py | \- build.
我正在为嵌套 matplotlib (MPL) 库编写文档(个人),该文档与 MPL 自己提供的文档不同,由感兴趣的子模块包提供。我正在编写 Python 脚本,希望能够在未来的 MPL 版本中自动生
我的目录结构如下: root/ __main__.py files/ __init__.py foo.py bar.py
我有一个名为 jiva_tasks 的包,我试图通过 celery 导入它(使用 celeryconfig 的 CELERY_IMPORTS 属性。celery 使用的导入语句是这样的: __impo
这里是这个测试中的文件: main.py app/ |- __init__.py |- master.py |- plugin/ |- |- __init__.py |- |- p1.p
我正在查看一些包含两个 __import__ 语句的代码,第二个 __import__ 语句不起作用,除非第一个语句已经运行。 目录结构是这样的: dir1 |-__init__.py |-sub
我正在尝试使用 __import__ 函数从 foo.bar import object 复制 ,但我似乎碰壁了。 一个更简单的例子 from glob import glob 很简单:glob =
使用 __import__ 执行以下操作以便我可以动态指定模块的最佳方法是什么? from module import * 最佳答案 我找到的唯一方法: module = __import__(mod
当使用带点名称的 __import__ 时,例如:somepackage.somemodule,返回的模块不是 somemodule,无论返回什么似乎大多是空的!这是怎么回事? 最佳答案 来自 __i
当我动态导入派生类时,我需要重写 python 中的 __import__ 函数。 (我只能访问基类代码)。例如: Servers=[] class ServerBase(object): n
当a.py有这段代码时: class A(): def __init__(self): print 'hi' 我在这段代码中使用 A 类: import a b = a.A()
对不起,通用标题,一旦我了解了问题的根源,就会更改它我有以下结构: foo/ foo/__init__.py foo/bar/ foo/bar/__init__.py foo/bar/some_mod
我是一名优秀的程序员,十分优秀!