【问题标题】:Reload Python module重新加载 Python 模块
【发布时间】:2015-01-12 10:00:17
【问题描述】:

我是 python 新手,我在编译我目前正在阅读的 Programming Collective Intelligence 书中的示例代码时遇到了问题。

我首先创建一个名为recommendations.py 的文件,然后添加一个字典,其中包含电影数据和人们对它们的评价。

然后在python解释器中

 >> 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)

然后在解释器中我被要求reload(recommendations) 但我得到NameError: 'recommendations' not defined

有什么问题? Recommendations.py 包含评论者字典和代码。 from recommendations import critics 有效,但重新加载无效。我是 python 新手。

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

    我的猜测是这本书(我无法访问它)在前面的代码中的某处告诉你输入import recommendations。您必须在键入 reload(recommendations) 的同一个解释器会话中执行此操作,以便重新加载工作。

    编辑:

    我刚刚注意到同样的问题is posed here - 看起来书中可能存在一个问题,如果你只是按照它来完成它是行不通的。

    【讨论】:

      【解决方案2】:

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

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

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

      然后reload(recommendations)

      问题在于,当您执行 from recommendations import critics 时,您已经导入了 critics,这可能只是您的 Recommendations.py 文件中的一个值,而不是一个模块(不是推荐文件夹中的评论家.py 文件) . reload 适用于模块,不适用于模块内的对象

      【讨论】:

      • 我确实有 Recommendations.py 文件。所以 reload() 一定能正常工作吗?
      • 来自 python 文档 reload"如果一个模块使用 from ... import ... 从另一个模块导入对象,则为另一个模块调用 reload() 不会重新定义从它导入的对象 —解决此问题的一种方法是重新执行 from 语句,另一种方法是使用导入和限定名称 (module.*name*)。"
      • @bakkal Jup,我看到了,想从 python 文档中添加原因,以确保您的答案的完整性
      • 随意编辑答案!除非该网站不允许您,否则我将使用文档中的引用对其进行编辑
      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多