重新加载Python模块

重新加载Python模块,python,Python,我是python新手,在编译我目前正在阅读的《编程集体智能》一书中的示例代码时遇到了一个问题 我首先创建了一个名为recommendations.py的文件,并添加了一个包含电影数据和人们对电影评级的字典 然后在python intrepreter中 >> from recommendations import critics >> critics['SomeName'] I get the data from the dictionary. 现在,书籍要求我添

我是python新手,在编译我目前正在阅读的《编程集体智能》一书中的示例代码时遇到了一个问题

我首先创建了一个名为
recommendations.py
的文件,并添加了一个包含电影数据和人们对电影评级的字典

然后在python intrepreter中

 >> from recommendations import critics 
 >> critics['SomeName']
 I get the data from the dictionary.
现在,书籍要求我添加代码

from math import sqrt
def sim_distance(prefs,person1,person2):
 si={}
 for item in prefs[person1]:
 if item in prefs[person2]:
 si[item]=1
  if len(si)==0: return 0
 sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
 for item in prefs[person1] if item in prefs[person2]])
 return 1/(1+sum_of_squares)
然后在intrepreter中,我被要求
重新加载(推荐)
,但我得到
名称错误:“推荐”未定义

问题是什么?py包含批评家词典和代码。来自建议导入的
有效,但重新加载不起作用。我是python新手

reload()
在模块上工作(例如,recommendations.py)

要重新加载
建议
,可以执行以下操作:

import recommendations
# use recommendations.critics['name']
然后重新加载(建议)


问题是,当您从推荐导入批评者时,您导入的是
批评者
,这可能只是您的recommunications.py文件中的一个值,而不是一个模块(不是推荐文件夹中的评论家.py文件)<代码>重新加载对模块起作用,对模块内的对象不起作用

我认为这里有一个概念上的问题<代码>建议.py是一个文件。从您的代码使用它的方式,我们可以推断它定义了一个模块源文件。您可以通过编写
导入建议
加载模块-然后在会话中有一个名为“建议”的模块对象。如果这样做,还可以使用
重新加载(建议)
重新加载模块。请注意,重新加载仅适用于以前从其模块源文件导入的模块对象。它不会第一次读取文件并导入模块。看看它是怎么解释的

在您的情况下,您尚未导入模块-您已使用“建议导入批评者”中的行导入了模块的特定组件(
批评者
)。因此,解释器会话不包含任何名为
推荐的内容
,并通过给出您看到的错误(
namererror:“推荐”未定义
)来告诉您

我的猜测是,前面代码中的某个地方的书(我没有访问它)告诉您键入
导入建议
。您必须在键入reload(建议)的同一解释器会话中执行此操作,以便重新加载工作

编辑:


我刚刚注意到了同一个问题——书中似乎有一个问题,如果你只是照着它去做,它可能不起作用。

我确实有recommunications.py文件。所以reload()必须正常工作?根据python文档
reload
“如果一个模块使用From…import…,从另一个模块导入对象,那么为另一个模块调用reload()不会重新定义从它导入的对象-一种方法是重新执行From语句,另一种方法是使用import和限定名(module.*name*)。@bakkal Jup,我看到了它,并想从python文档中添加原因,以确保答案的完整性。请随意编辑答案!除非网站不允许,否则我将使用文档中的引用对其进行编辑