重新加载Python模块

时间:2015-01-12 10:00:18

标签: python

我是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中我被问到reload(recommendations)但我得到了NameError: 'recommendations' not defined

问题是什么? suggest.py包含评论家词典和代码。 from recommendations import critics有效,但重新加载不起作用。我是python的新手。

2 个答案:

答案 0 :(得分:1)

reload()适用于模块(例如recommendations.py)

要重新加载recommendations,您可以这样做:

import recommendations
# use recommendations.critics['name']

然后reload(recommendations)

问题是当你执行from recommendations import critics时,你导入了critics,这可能只是你的suggest.py文件中的一个值,而不是一个模块(不是一个里面的critics.py文件)推荐文件夹)。 reload适用于模块,不适用于模块内的对象

答案 1 :(得分:1)

我认为你在这里有一个概念问题。 recommendations.py是一个文件。从您的代码使用它的方式,我们可以推断它定义a module - 它是模块源文件。您可以通过编写import recommendations来加载模块 - 然后在您的会话中有一个名为recommended的模块对象。如果您这样做,那么您也可以使用reload(recommendations)重新加载模块。请注意,重新加载将对先前从其模块源文件导入的模块对象起作用。它不会首次读取文件并导入模块。请参阅the documentation for reload解释的内容。

在您的情况下,您尚未导入模块 - 您已使用行critics导入模块的特定组件(from recommendations import critics)。因此,解释器会话不包含任何名为recommendations的内容,并通过给出您看到的错误(NameError: 'recommendations' not defined)来告诉您。

我的猜测是,在上面的代码中,某本书(我无法访问它)告诉您键入import recommendations。您必须在与重新加载(推荐)类型相同的解释器会话中执行此操作,以便重新加载。

<强> 编辑:

我刚刚注意到同样的问题is posed here - 看起来书中可能存在一个问题,即只要你遵循它就不会有效。