gpt4 book ai didi

python reload() 没有任何效果?

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:00 25 4
gpt4 key购买 nike

我在 pyspark 目录中有一个 hbase.py 文件。在 REPL 中,我尝试重新加载它:

>>> reload(pyspark.hbase)
<module 'pyspark.hbase' from '/shared/hwspark2/python/pyspark/hbase.py'>
>>> from pyspark.hbase import *
>>> # run the code .. latest changes not apparent..

没有错误.. 然而,类的定义没有更新——新的打印语句没有出现就是证明。

退出解释器并重新加载模块后,更新可见。然而,即使在调用 reload 之后,对模块的任何进一步更改也是不可见的。

最佳答案

这个问题并不完全清楚,但我认为你误解了什么 reload

它重新导入模块,包括其中定义的所有新类对象,并更改 sys.modules[name]引用那个新模块对象,它还会将名称复制到您的全局变量中。

但这就是它所做的全部。它不会自动找到对旧模块的所有引用,更不用说对旧模块中定义的任何内容等,并将它们全部修复以引用替换版本。 (怎么可能?新模块中甚至可能都没有替换版本。就此而言,如果您有由旧代码计算的值并且计算方式不同会怎么样;它会有重新运行自导入模块以来所做的一切。)

文档(上面链接)用不同的术语对其进行了解释,但让我们将其具体化,以便更直接地进行解释。

创建这个文件:

# mod.py
class Spam(object):
def eggs(self):
print('spam spam spam spam')

现在:

$ python
>>> import mod
>>> spam = mod.Spam()
>>> spam.eggs()
spam spam spam spam

现在让我们编辑它:

# mod.py
class Spam(object):
def eggs(self):
print('out of spam!!!')

>>> reload(mod)
>>> spam.eggs()
spam spam spam spam
>>> morespam = mod.Spam()
>>> morespam.eggs()
out of spam!!!
>>> type(spam) is type(morespam)
False

当您创建 spam 时调用mod.Spam() , 查找 'mod'在全局变量中,然后查找 'Spam'在生成的模块中,然后调用其构造函数和初始化程序,为您提供一个对象,其 __class__是对 mod.Spam 的引用类。

当您调用 spam.eggs() 时, Python 查找 'spam'在全局词典中查找'eggs'在那spam对象的字典,然后,如果失败,查找 'eggs'spam.__class__对象的字典。正如我们所知,那是 mod.Spam对象,它有一个 eggs方法,以便调用。

现在,在我们reload(mod)之后,有一个名为 'mod' 的新对象, 它有一个名为 'Spam' 的新类作为成员(member)。但是老modmod.Spam对象——就此而言,你的 spam ——仍然存在。和现有spam仍然引用旧的 mod.Spam在其 __class__ .所以,当你调用 spam.eggs()第二次,同样的事情发生了。 Python 查找 'spam'作为一个全局性的,查找'eggs'第一名spam然后在 spam.__class__ , 找到与之前相同的类,并调用与之前相同的函数。

当我们构造morespam时调用mod.Spam()再次,现在查找'mod'在全局变量中找到新的 'mod' .然后查找 'Spam'在该模块中并找到新类。所以,我们有一个实例,它的 __class__是新的mod.Spam .当我们称它为 eggs 时方法,发生与上面相同的事情,但现在调用的是新函数。


使用 from mod import *而不是 import mod使事情有点难以理解,但基本思想是相同的。 from mod import *不放mod到您的全局变量中,然后将其所有非私有(private)全局变量(在 mod.__all__ 中列出的任何内容,或者,如果不存在此类内容,则在 mod 中不以单个下划线开头的任何内容)复制到您的全局变量中。所以,reload创建一个新的模块对象,第二个 from mod import *将该新模块的所有非私有(private)全局变量复制到您的全局变量中,替换旧的。但是你的spam instance 仍然是旧 Spam 的一个实例,不是新的。

关于python reload() 没有任何效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26517602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com