【问题标题】:After delete a variable and then reload the module,how can I make the namespace not retain this variable?删除变量然后重新加载模块后,如何使命名空间不保留该变量?
【发布时间】:2018-01-14 04:15:25
【问题描述】:

如果您在重新加载之前在模块中删除它,“重新加载”函数无法删除已加载到内存中的变量。换句话说,即使你在重新加载之前删除了变量,它仍然存在。

根据(DOCS):

当一个模块被重新加载时,它的字典(包含模块的全局变量)被保留。

这是一个简单的例子:

import importlib
import time
def main():
    import ex1
    i = 0
    while True:
        importlib.reload(ex1)
        ex1.x = ex1.x + 1
        i = i + 1
        print("loop:%d" %i)
        print("x:%d" %ex1.x)
        print(dir(ex1))
        time.sleep(5)

ex1模块重载前的内容:

x = 1
y = 1

然后删除x并重新加载ex1,我们会发现x还在dir(ex1)

那么,我的问题是如何获得dict,其中x 在删除和重新加载后不在dir 中?

【问题讨论】:

  • 你到底想做什么?通常不建议在普通代码中使用reload()
  • 这是XY吗?
  • 如果ex1中有x, y的值,当然每次重新加载ex1x, y都会再次出现。但是,如果您 del ex1.x 并且没有重新加载,那么 ex1.x 将从您的命名空间中消失。
  • @Idlehands 谢谢你的回答,是的,它可以做到。但我不想更改ex1中的代码。
  • @StephenRauch ex1 模块只有xy。这只是解释我的问题的小例子。所以实际上我有更多的变量、函数和类

标签: python reload


【解决方案1】:

在你引用的句子出现之后,你没有读得足够远:

重新定义名称将覆盖旧定义,因此这通常不是问题。如果模块的新版本没有定义旧版本定义的名称,则旧定义仍然存在。

所以,你引用的这句话只适用于旧版本模块中定义的变量,而新版本模块中没有定义的变量。

所以你的问题:

那么,我的问题是如何在删除和重新加载后获得x 不在dir 中的dict

答案是你不能。但是你可以这样做:

del ex1.x

重新加载后。

【讨论】:

  • del ex1.x,他们使用的是import ex1,而不是from ex1 import x, y
  • 为什么我做不到?改变reload的实现机制怎么样?或者import
  • 当然你也可以实现自己的 Python。但这似乎超出了您的问题范围。
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 2013-05-28
  • 1970-01-01
  • 2013-03-28
  • 2020-03-31
  • 2018-08-19
  • 1970-01-01
  • 2021-06-15
相关资源
最近更新 更多