我是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的新手。
答案 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 - 看起来书中可能存在一个问题,即只要你遵循它就不会有效。