首页 > 编程语言 >Python|module 的 __spec__ 属性

Python|module 的 __spec__ 属性

时间:2024-05-28 19:02:48浏览次数:17  
标签:__ .__ name Python module 模块 spec

Python 的 module(模块)

**【官方文档】**位置:https://docs.python.org/zh-cn/3/library/stdtypes.html#modules

模块唯一的特殊操作是属性访问: m.name,这里 m 为一个模块而 name 访问定义在 m 的符号表中的一个名称。 模块属性可以被赋值。 (请注意 import 语句严格来说也是对模块对象的一种操作;import foo 不要求存在一个名为 foo 的模块对象,而是要求存在一个对于名为 foo 的模块的 (永久性) 定义。)

每个模块都有一个特殊属性 __dict__。 这是包含模块的符号表的字典。 修改此字典将实际改变模块的符号表,但是无法直接对 __dict__ 赋值 (你可以写 m.__dict__['a'] = 1,这会将 m.a 定义为 1,但是你不能写 m.__dict__ = {})。 不建议直接修改 __dict__

内置于解释器中的模块会写成这样: <module 'sys' (built-in)>。 如果是从一个文件加载,则会写成 <module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>

其中,<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'> 中的 os 为模块名,/usr/local/lib/pythonX.Y/os.pyc 为模块对应 py 或 pyc 文件路径。

module 的使用场景
for module_name, module_obj in sys.modules.copy().items():
    pass

在使用以上逻辑遍历 sys.modules 时(根据 Python 文档,为避免并发问题,在遍历 sys.modules 时建议使用 .copy()),键 module_name 为模块名,值 module_obj 为 module。

但是,module_obj 也会存在部分非 moiduleclass,例如:<class 'typing.io'>。要区分 module 和 class,可以通过查看 module 对象和 class 对象的类名称,即 module_obj.__class__.__name__;此时 module 的类名称为 module,class 的类名称为 type

module 模块信息获取方法

要获取 module 类中的信息,可以通过 module.__spec__ 获取,module.__spec__ 的类型为 Optional[ModuleSpec],即为 ModuleSpecNone

**【module.__spec__ 的官方文档】**位置:https://docs.python.org/zh-cn/3/reference/import.html#spec__

根据当前了解,仅有以下 2 种情况下,module.__spec__None

  • 启动主模块(__main__
  • cython 相关的模块(例如 cython_runtime_cython_0_29_35

对于非空的 ModuleSpec,执行打印(即执行 ModuleSpec.__repr__)的结果样例如下。通常来说,nameloaderorigin 这 3 个属性一定存在,其中 name 为模块名,loader 为模块加载器,origin 为对应的 py 脚本路径。部分模块还包含 submodule_search_locations 属性,为搜索子模块的路径。例如:

ModuleSpec(name='numpy', loader=<_frozen_importlib_external.SourceFileLoader object at 0x00000213EF0A8C70>, origin='D:\\py\\Python310\\lib\\site-packages\\numpy\\__init__.py', submodule_search_locations=['D:\\py\\Python310\\lib\\site-packages\\numpy'])

origin 不为 py 脚本路径的情况:

  • 内置模块,loader<class '_frozen_importlib.BuiltinImporter'>originbuilt-in
  • _frozen_importlib_frozen_importlib_externalzipimportimportlib._bootstrapimportlib._bootstrap_external 这 5 个特殊的内置模块,loader<class '_frozen_importlib.FrozenImporter'>originfrozen

标签:__,.__,name,Python,module,模块,spec
From: https://blog.csdn.net/Changxing_J/article/details/139274666

相关文章

  • 使用Python进行数据分析与可视化的简单示例
    使用Python进行数据分析与可视化的简单示例。在这个示例中,我们将使用Pandas库进行数据分析,并使用Matplotlib库进行数据可视化。首先,假设我们有一个包含销售数据的CSV文件(sales_data.csv),其中包含以下列:日期(Date)、销售额(Sales)和产品类别(Product_Category)。CSV文件的内容可能......
  • 为进一步强化保密工作的组织领导,明确相关人员保密工作职责,新修订的《中华人民共和国保
    为进一步强化保密工作的组织领导,明确相关人员保密工作职责,新修订的《中华人民共和国保守国家秘密法》专门明确了机关、单位都应当“()”,旨在推动保密工作有机构管理、有人负责,切实将保密工作责任制落到实处,提升机关、单位保密管理能力。详细内容完整查看A.依法设置安全工作机......
  • Steam游戏搬砖:靠谱吗,详细版说下搬砖中的核心内容!
    可能大家也比较关注国外Steam游戏搬砖这个项目,最近单独找我了解的也比较多,其实也正常,因为现在市面上的项目很多都很鸡肋,而且很多都是一片红海,内卷太过严重,所以对于Steam的关注度也高很多,更何况Steam搬砖无需引流,时间也自由,综合来看,确实是不错的项目。但是,也有点不足,那就是利......
  • ICPC训练赛补题集
    ICPC训练赛补题集文章目录ICPC训练赛补题集D-FastandFat(负重越野)I-路径规划G.Inscryption(邪恶铭刻)D-FastandFat(负重越野)原题链接:原题链接题意:体重大的背体重小的速度不变,体重小的背体重大的速度会变化,变化......
  • C++实现获取设备管理器中的设备信息
     C++实现获取设备管理器中的设备信息,基本调用了windowsAPI函数,除此之外,还引用了setupapi.lib库,代码如下所示://PrintDeviceInfo.cpp:定义控制台应用程序的入口点。//#include<stdio.h>#include<locale.h>#include<Windows.h>#include<setupapi.h>#pragmacomm......
  • C++实现删除打印机副本功能
     我们要实现此功能,首先需要获取到打印机的名称,其次是将获取到的打印机名称依次删除。一、获取打印机副本名称1.我们获取打印机副本名称,可以使用windowsAPI中的EnumPrinters函数,该函数可以枚举出我们电脑中的打印机设备信息,该函数使用方法如下:DWORDFlags=PRINTER_ENU......
  • C++实现dll文件的显示调用
    我们实现dll文件的显示调用,主要分为三个步骤:创建DLL、导出函数、使用DLL。其中离不开WindowsAPI函数,使用到了LoadLibrary、GetProcAddress、 FreeLibrary等,以下是一个简单的示例程展示整个过程。:1.创建DLLMyLibrary.h//MyLibrary.h#ifndefMY_LIBRARY_H#defineMY_LI......
  • 来自学术界的知识库 RAG 调优方案实践(一)
    背景介绍在之前的文章详细梳理过工业界的RAG方案QAnything和RagFlow,这次主要整理下来自学术界的一系列RAG优化方案。主要关注优化方案对应的设计思想以及相关的实现,希望可以对大家的RAG服务效果提升有所帮助。基础介绍在综述论文Retrieval-AugmentedGenerati......
  • vue基础
    vuevue简介vue是一个MVVM框架,Model-View-ViewModel是一个MVC的前端版本ViewModel是一个控制器的角色,在他里面实现逻辑运算等,这样就可以把Model层和View层高度分离View:视图,用于封装和展示数据以及效果,其实就是html结构Model:数据模型,用来封装数据以及数据运行的业务逻......
  • 高斯公式对高斯定理的推导
    目录前置定理基础证明过程参考资料这里主要讨论多元微分学中学到的高斯公式对于物理上的高斯定理的推导(目前是对于静电荷的高斯定理)。本身想连着Stokes公式一大堆一块写,但是考虑到工程量太大了,所以尝试分篇来写吧。前置定理基础标准的高斯公式的形式如下(推导略)\[\iiint_{\Omeg......