如何在python中重新加载命名空间? [复制]

Posted

技术标签:

【中文标题】如何在python中重新加载命名空间? [复制]【英文标题】:how to reload the namepace in the python? [duplicate] 【发布时间】:2012-04-26 15:49:17 【问题描述】:
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+sqrt(sum_of_squares))

reload(recommendations)
recommendations.sim_distance(critics,'Lisa Rose','Gene Seymour')

这是错误

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    recommendations.sim_distance(critics,'Lisa Rose','Gene Seymour')
NameError: name 'critics' is not defined

critics 是一个自定义数组

【问题讨论】:

你在哪里初始化critics 在 Recommendations.py 中,在 sim_distance 之前 如果您可以包含初始化批评者的代码,我想我们可以找出问题所在。正如下面已经提到的,解释器告诉你它在当前范围内没有任何名为 critics 的东西。我猜你是在一个函数中定义它,这意味着一旦函数返回它就不再在范围内了。 是的,这是范围问题,我在函数外部的全局范围中定义了critic,然后它就可以解决。但是如果我下次要使用critic,我必须每次都初始化它吗?是否有更简单的定义方法,比如保存在一个文件中以便我调用。 @Andrew Barrett:太复杂了,我现在看不懂。无论如何谢谢。 【参考方案1】:

这与重新加载命名空间没有任何关系。你根本没有定义critics

【讨论】:

我已经写在recommens.py中,在sim_distance()之前。我应该在其他地方定义它吗? @MindHacks:也许你的意思是 Recommendations.critics? 是的,我已经解决了这个问题。谢谢~【参考方案2】:

这看起来可能是范围问题。如果您在不同的功能中定义评论家,那么评论家将只存在于该功能中。您在此函数的主要范围内引用了评论家,因此您需要从创建它的函数中返回评论家,或者(不理想)最初在全局范围内定义它。

def initCritics():
    critics = []
    # make some critics

    return critics

critics = initCritics()

recommendations.sim_distance(critics,'Lisa Rose','Gene Seymour')

【讨论】:

谢谢!很有帮助。

以上是关于如何在python中重新加载命名空间? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在IronPython中调用C#/ .NET命名空间?

在 PHP 5.3 中使用命名空间自动加载?

Python:将字典中的变量加载到命名空间中

Python学习:函数进阶

尝试从命名空间加载类您是不是忘记了另一个命名空间的“使用”语句?

python日记----2017.7.26