首页 > 编程问答 >为什么重新加载后“globals()”中会出现未声明的变量,并且使用它们来识别重新加载是否安全?

为什么重新加载后“globals()”中会出现未声明的变量,并且使用它们来识别重新加载是否安全?

时间:2024-07-24 03:59:08浏览次数:18  
标签:python python-importlib

我发现重新加载模块时下面的代码片段 test 出乎意料地已经在 globals() / locals() 中定义了所有变量。

为什么会发生这种情况?

我注意到了这个 "xxx" in locals() 模式| ||Blender Python 脚本中有很多 ,因为人们通常使用它来检查模块之前是否已重新加载(通常在开发过程中会重新加载这些脚本)。由于每个人都在使用它,我想它应该在大多数情况下都可以工作。 但是使用此警告来确定模块之前是否已经加载真的安全吗(有什么想法无法工作的情况吗?)?我的意思不仅仅是开发和测试的东西,因为它看起来更像是可能在生产中中断的实现细节。

test.py:

# prints False, False, False
import test
import importlib

# prints True, True, True
importlib.reload(test)

test.py:

print("a" in globals(), "b" in globals(), "c" in globals())

# NameError: name 'a' is not defined
# print(a)

a = 25
b = 35
c = 45

当模块第一次被导入时,它会被执行。 这意味着将定义 a b c ,并且对它们的 print 语句将评估为 True 。这就是为什么在重新加载模块后在 globals() 中看到它们的原因。

但是, 'xxx' in locals() 不是检测模块重新加载的可靠方法。以下是它可能失败的一些原因:

  1. 第一次导入时该变量可能存在: 如的示例所示,如果在检查之前定义了变量,则即使模块尚未重新加载,该检查也会返回 True
  2. 该变量可能是在其他地方定义的: globals() locals() 受调用它们的作用域的影响。如果另一个模块或函数在同一个名称空间中定义了 xxx ,则检查可能会返回 True ,即使相关模块尚未重新加载。
  3. 该变量可能已被明确删除: 如果一个模块确实重新加载并且出于某种原因删除了一个以前定义的变量,则该检查将返回 False ,即使该模块已重新加载。

那么,检测模块重新加载的可靠方法是什么?

Python 的 importlib 模块提供了一个可靠的方法来做到这一点:可以检查模块的 __spec__.loaded 属性。在重新加载模块后,此属性将更新为新的加载时间。

这是一个示例:

import importlib

# 第一次导入模块
import my_module

original_load_time = my_module.__spec__.loaded

# 做一些事情...

# 重新加载模块
importlib.reload(my_module)

# 检查模块是否已重新加载
if my_module.__spec__.loaded != original_load_time:
    print("模块已重新加载!")

这种方法比检查 locals() globals() 更可靠,因为它直接依赖于 Python 的导入机制。

标签:python,python-importlib
From: 78785096

相关文章

  • 如何使用 Python API 获取每个模型的活跃用户列表、最后登录信息
    我想通过PythonAPI获取我的dbt项目的所有模型中的活动或非活动用户列表。这可能吗?我尝试列出模型,但无法获取用户信息,如用户名、项目、以及上次活动或上次登录。不幸的是,dbt本身并不跟踪你所寻找的用户活动数据(最后登录、活跃用户等)。dbt的主要功能是转换数据,而不......
  • Python tkinter 窗口不断关闭,我不知道为什么
    我正在尝试制作一个有趣的小程序,其中每小时左右就会有一只毛茸茸的动物走过屏幕。我有一个主窗口,它启动一个循环,每小时左右播放一次动画/声音,但是在口袋妖怪第一次完成行走后,整个程序就会结束。我认为这可能与我设置tkinter窗口的方式有关,但我无法弄清楚。我认为在这里包含......
  • 用于自动访问 MongoDB Atlas CLI 的 Python 脚本
    我想编写一个Python脚本,以便普通用户可以访问他的数据库并从他的终端执行CRUD操作。我正在查看官方文档,但我有点迷失。有人可以给我指点基本教程来开始吗?当然,以下是如何构建Python脚本来访问MongoDBAtlasCLI的基本教程:先决条件:MongoDBAtlas......
  • Python实现简单学生登陆系统
     代码:importhashlibclassStudent:def__init__(self,username,password):#初始化学生对象,存储用户名和加密后的密码self.username=usernameself.password=hashlib.sha256(password.encode()).hexdigest()defcheck_passwo......
  • python猜数字游戏
    好的,下面是一个简单的小游戏代码示例,使用Python编写。这个游戏是一个猜数字游戏,玩家需要猜一个1到100之间的随机数。importrandomdefguess_number_game():print("欢迎来到猜数字游戏!")print("我已经想好了一个1到100之间的数字,请你猜一猜。")secret_num......
  • 【Python正则表达式】:文本解析与模式匹配
    文章目录1.正则表达式2.re模块3.修饰符3.元字符3-1字符匹配元字符3-2重复次数限定元字符3-3字符集合匹配元字符3-4分组元字符3-5边界匹配元字符3-6字符类别匹配元字符4.技巧4-1贪婪与非贪婪5.案例1.正则表达式正则表达式面向什么样的问题?1、判断一个字......
  • 仅需增加2行代码,Python量化策略速度提升20+倍!
    今天分享一个Python量化策略加速的小技巧,不用修改原有代码,只需在原有代码里新增2行,策略执行速度便可能提高20+倍,正文开始~现如今,无论是入门量化投资,还是做数据分析、机器学习和深度学习,Python成为了首选编程语言,直观的原因就是容易上手和资源丰富,但Python有个根深蒂固的标签,......
  • Python基础-Anaconda,Spyder,数据类型
    1、Python与Anaconda在想使用Python之前需先安装Python,以及PythonIDE和Python的库,而用Anaconda就可以一键安装。Anaconda包含了Python,常用的python库以及IDE,还具有强大的环境和python包的管理能力。PythonIDE(IntegratedDevelopmentEnvironment,集成开发环境)是一个为开发......
  • python实现图像特征提取算法2
    python实现广义Hough变换算法、Hough变换算法1.广义Hough变换算法详解算法步骤Python实现详细解释优缺点2.Hough变换算法详解算法步骤Python实现详细解释优缺点实现广义Hough变换算法(GeneralizedHoughTransform)可以用于检测任意形状的......
  • 使用Python自动备份MC服务器存档至轻量COS
    在存档意外炸档时,备份就显得尤为重要。本文以Minecraft1.18.2为例,教你如何使用轻量搭建一个MC服务器,并定时将存档备份入轻量COS,节省本地空间。前期准备一台安装了Linux原版系统的轻量(因为目前轻量COS仅支持挂载Linux系统镜像,不支持容器或自定义镜像)一个和轻量大区相同的轻......