在Python3中,star import的函数形式是什么
在Python中,使用函数(可能来自于在Python3中,star import的函数形式是什么,python,python-3.x,python-import,Python,Python 3.x,Python Import,在Python中,使用函数(可能来自于importlib)的import*的等价物是什么 我知道您可以使用mod=\uuuu import\uuuu(…)导入模块,该模块将委托给当前配置的实现。你也可以这样做 mod_spec = importlib.utl.spec_from_file_location(...) mod = importlib.util.module_from_spec(mod_spec) mod_spec.loader.exec_module(mod) 它允许你做一些疯狂
importlib
)的import*
的等价物是什么
我知道您可以使用mod=\uuuu import\uuuu(…)
导入模块,该模块将委托给当前配置的实现。你也可以这样做
mod_spec = importlib.utl.spec_from_file_location(...)
mod = importlib.util.module_from_spec(mod_spec)
mod_spec.loader.exec_module(mod)
它允许你做一些疯狂的事情,比如在调用exec\u module
之前插入一些东西到模块中。(和提供)
然而,我的问题仍然存在。
import*
是如何以函数形式工作的?什么函数根据\uuuu all\uuuuu
的存在/内容确定要从模块加载哪些名称?没有任何函数用于从任何导入*加载。事实上,也没有用于导入任何内容的函数!当你这样做的时候
mod = __import__(...)
\uuuu导入\uuuu
功能仅负责部分作业。它为您提供了一个模块对象,但您必须将该模块对象单独分配给一个变量。没有函数可以像导入任何功能那样导入模块并将其分配给变量
在来自任何导入的中*
,有两个部分:
- 为
任何内容准备模块对象
- 分配变量
“准备模块对象”部分几乎与导入任何内容
中的内容相同,并且可以通过相同的功能导入
来处理。在import*
将加载包的\uuuuuu all\uuuuu
列表中任何尚未加载的子模块方面有一个细微的区别<代码>\uuuu导入\uuuuu如果您提供fromlist=['*']
将为您处理此问题:
module = __import__('whatever', fromlist=['*'])
关于命名的部分是出现巨大差异的地方,同样,你必须自己处理。只要您在全球范围内,这就相当简单:
if hasattr(module, '__all__'):
all_names = module.__all__
else:
all_names = [name for name in dir(module) if not name.startswith('_')]
globals().update({name: getattr(module, name) for name in all_names})
函数作用域不支持分配在运行时确定的变量。Afaik来自mod import*
没有以某种方式公开,有一个特殊的字节码为它生成,由C
代码处理。@JimFasarakis Hilliard。如果可能,我将继续等待答复。Importlib公开或至少复制了一些非常详细的功能。我一直认为它有完整的加载机制,但没有找到这个特殊的部分。也不确定这就是为什么我要发表评论:-)。为什么要删除python标记?你排除了很多没有潜藏在3.x
标签中的人去看它。@JimFasarakis Hilliard。我的问题与Python3特别相关,但我想你有一个很好的观点。已恢复。所有与python
相关的问题都应使用genericpython
标记。如果一个问题是关于某个特定版本的,那么除了泛型标记之外,还可以添加一个更具体的标记。我同意没有函数可以精确地替换这两个语句,但是有一个等价的函数调用(或两个调用)可以做同样的事情。我很惊讶(也有点怀疑)您提供的选择代码在importlib中的某个地方不存在。@MadPhysicast:他们不会提供为您分配变量的函数。太多的魔法,它只能在全局或类范围内使用。(常规Python 3import*
只能在全局范围内使用,但函数内部的常规import*
可以在编译时捕获)。这很有意义。我将等待一天左右,然后选择您的答案。刚刚最终处理fromlist=['*']
。这是唯一不重要的部分,谢谢你specifically@Mr_and_Mrs_D:它将导入在\uuu init\uuuu.py
末尾加载的任何子模块。这些是哪些子模块将取决于程序中执行了哪些其他导入。