如何判断Python模块是否在其内部被reload()?

2 投票
2 回答
734 浏览
提问于 2025-04-16 17:51

在写Python模块的时候,有没有办法判断这个模块是被导入还是重新加载的呢?

我知道可以创建一个类,这样__init__()方法只会在第一次导入的时候被调用,但我本来不打算创建类。如果没有简单的方法来判断我们是被导入还是重新加载的,那我就会考虑创建一个类。

2 个回答

0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序里使用这些数据。这个过程就像是从冰箱里拿食材,然后用它们做饭。

有些时候,数据的获取可能会出现问题,比如网络不稳定或者数据源出现故障。这就像是你去冰箱找食材时,发现冰箱坏了,拿不到想要的东西。

为了避免这种情况,我们可以设置一些“备用计划”。比如,如果第一次尝试获取数据失败了,我们可以再试一次,或者从其他地方获取数据。这就像是你去冰箱找不到食材时,决定去超市买一些。

在代码中,我们可以使用一些简单的逻辑来处理这些情况,确保程序能够顺利运行,而不会因为小问题而崩溃。

>>> import os
>>> os.foo = 5
>>> os.foo
5
>>> import os
>>> os.foo
5
3

关于 reload() 的文档里其实有一段代码示例,我觉得应该能满足你的需求,至少在一般情况下是这样的。你可以这样做:

try:
    reloading
except NameError:
    reloading = False # means the module is being imported
else:
    reloading = True # means the module is being reloaded

这段代码的主要作用是判断模块是被“干净地”导入(比如说第一次导入)还是在覆盖之前的同一个模块。在正常情况下,“干净”的导入对应的是 import 语句,而“脏”的导入对应的是 reload(),因为 import 只会在第一次执行时真正导入模块(对于每个特定的模块来说)。

如果你以某种方式强制再次执行 import 语句让它做一些复杂的事情,或者你用 reload() 第一次导入你的模块,或者你在导入机制上搞了一些花样(比如通过 imp 模块等),那么就不能保证它会正常工作了。换句话说,不要指望这个方法在所有情况下都能有效。

附言:你问这个问题让我觉得你可能在做一些不该做的事情,不过我就不问了。

撰写回答