当前位置: 首页 > 面试题库 >

Python 3中星号导入的功能形式是什么

王弘和
2023-03-14
问题内容

import *在Python中使用函数(大概来自importlib)相当于什么?

我知道您可以使用导入一个模块mod = __import__(...),该模块将委派给当前配置的实现。您也可以做类似的事情

mod_spec = importlib.utl.spec_from_file_location(...)
mod = importlib.util.module_from_spec(mod_spec)
mod_spec.loader.exec_module(mod)

这样您就可以做一些疯狂的事情,例如通过在调用之前将它们插入模块中来将其注入模块exec_module

但是,我的问题仍然存在。如何import *以函数形式工作?哪个函数决定根据模块的存在/内容从模块加载哪些名称__all__


问题答案:

没有的功能from whatever import *。实际上,也不存在任何功能import whatever!当你做

mod = __import__(...)

__import__功能仅负责部分工作。它为您提供了一个模块对象,但是您必须将该模块对象分别分配给变量。没有函数可以导入模块 并将其
分配给变量import whatever

在中from whatever import *,有两个部分:

  • 准备模块对象 whatever
  • 分配变量

“准备模块对象”部分与中的几乎相同import whatever,并且可以由相同的函数处理__import__。两者之间有一个细微的差异,import *它将加载软件包__all__列表中所有尚未加载的子模块。__import__如果您提供,将为您处理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})

函数作用域不支持分配在运行时确定的变量。



 类似资料:
  • 在Java8中,新的包是Java。util。函数包含很多函数接口。该软件包的文档(http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)多次提到“函数形状”: 有几种基本函数形状,包括函数(从T到R的一元函数)、消费者(从T到void的一元函数)、谓词(从T到布尔的一元函数)和供应者(从T到

  • 问题内容: 这段代码来自http://docs.python.org/2/tutorial/errors.html#predefined-clean-up- actions 我不明白的是print命令末尾的含义。 我还检查了文档http://docs.python.org/2/library/functions.html#print。 没有足够的理解,这是一个错误吗?(似乎不是。它来自官方教程)。

  • 问题内容: 在Python中像在C中一样具有特殊含义吗?我在Python Cookbook中看到了这样的函数: 你能向我解释一下还是指出我在哪里可以找到答案(Google将解释为通配符,因此我找不到令人满意的答案)。 问题答案: 假设知道位置和关键字参数是什么,下面是一些示例: 范例1: 如你在上面的示例中所见,函数签名中仅包含参数。由于d和k不存在,因此将它们放入字典。该程序的输出为: 范例2:

  • 问题内容: 在Swift函数签名中,参数after意味着什么?更具体地说,这是否意味着需要在传递参数之前将其解开,或者在传递参数时(自动)将其解开。这是一个示例: 在这种情况下,该函数是UIButton的目标,因此无论发生什么情况,它都会自动发生。 我的想法是,这意味着您可以期待一个未包装的对象,因此您无需尝试对其进行包装。 问题答案: 这不是完全重复的- 函数签名中 隐式展开的可选 变量 有一些

  • 问题内容: 在此页面中,我找到了新的JavaScript函数类型: 我已经知道了什么,以及做的,但不知道什么是注定的。它是什么? 问题答案: 这是一个生成器功能。 生成器是可以退出并稍后重新输入的函数。它们的上下文(变量绑定)将在重新进入时保存。 调用生成器函数不会立即执行其主体。而是返回该函数的迭代器对象。调用迭代器的方法时,将执行生成器函数的主体,直到第一个表达式指定要从迭代器返回的值,或者使

  • 第一章走马观花的带着大家复习了一下C++ Template的基本语法形式,也解释了包括 typename 在内,类/函数模板写法中各个语法元素的含义。形式是功能的外在体现,介绍它们也是为了让大家能理解到,模板之所以写成这种形式是有必要的,而不是语言的垃圾成分。 从下一章开始,我们便进入了更加复杂和丰富的世界:讨论模板的匹配规则。其中有令人望而生畏的特化与偏特化。但是,请相信我们在序言中所提到的:将