Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python3中,star import的函数形式是什么_Python_Python 3.x_Python Import - Fatal编程技术网

在Python3中,star import的函数形式是什么

在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) 它允许你做一些疯狂

在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)
它允许你做一些疯狂的事情,比如在调用
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
相关的问题都应使用generic
python
标记。如果一个问题是关于某个特定版本的,那么除了泛型标记之外,还可以添加一个更具体的标记。我同意没有函数可以精确地替换这两个语句,但是有一个等价的函数调用(或两个调用)可以做同样的事情。我很惊讶(也有点怀疑)您提供的选择代码在importlib中的某个地方不存在。@MadPhysicast:他们不会提供为您分配变量的函数。太多的魔法,它只能在全局或类范围内使用。(常规Python 3
import*
只能在全局范围内使用,但函数内部的常规
import*
可以在编译时捕获)。这很有意义。我将等待一天左右,然后选择您的答案。刚刚最终处理
fromlist=['*']
。这是唯一不重要的部分,谢谢你specifically@Mr_and_Mrs_D:它将导入在
\uuu init\uuuu.py
末尾加载的任何子模块。这些是哪些子模块将取决于程序中执行了哪些其他导入。