【问题标题】:NameError: global name 'operator' is not definedNameError:未定义全局名称“操作员”
【发布时间】:2013-11-02 09:39:32
【问题描述】:
import KNN
def c(i,d,l,k):
    dss=d.shape[0]
    dm=tile(i,(dss,1))-d
    sqm=dm**2
    sqd=sqm.sum(axis=1)
    dist=sqd**0.5
    sDI=dist.argsort()
    clc={}
    for i in range(k):
        vl=l[sDI[i]]
        clc[vl]=clc.get(vl,0)+1     
    sCC=sorted(clc.items(),key=operator.itemgetter(1),reverse=True)
    return sCC[0][0]

c([0,0],g,l,3)

错误:

Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    c([0,0],g,l,3)
  File "<pyshell#31>", line 12, in c
    sCC=sorted(clc.items(),key=operator.itemgetter(1),reverse=True)
NameError: global name 'operator' is not defined

KNN 包含以下代码:

from numpy import *
import operator

def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels

为什么会出现上述错误?程序在 Python 3.3.2 上运行。此代码是在 Python 中运行的简单 k 分类算法。

【问题讨论】:

  • 你在哪里import KNN你也应该import operator

标签: python python-3.x error-handling


【解决方案1】:

你需要import operator进入本地命名空间; import KNN 不会同时导入它导入的子模块。

通常,您需要明确说明您使用的所有模块和对象,builtins (https://docs.python.org/2/library/functions.html) 除外。

与其他一些语言不同,没有隐式导入。

关于导入的高级提示/社论: 您可能很想使用KNN.operator。它在那里可用,因为它是由KNN 导入的。然而,这几乎总是一个令人遗憾的决定,就像混淆了图片:这是一个特殊的模块吗?如果有,它的界面是什么?保存可爱,直言不讳。

【讨论】:

  • import KNN 确实导入了operator 并使其可作为KNN.operator 使用,它只是不能作为operator 使用。这意味着你可以写KNN.operator.itemgetter 如果你真的想写。但那将是愚蠢的。如果你想用operator,没关系,其他模块也想用它;只需导入它。
  • @abarnert - 确实它确实“暴露”了 - 但不像 Pavan 预期的那样。
  • 是的,我认为你解释得很好,足以回答 OP 的问题,大多数人都会带着类似的问题来搜索;我只是认为该评论可能对了解一点但还不够多的人有用。
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 2014-10-24
  • 2012-05-29
  • 2013-08-23
  • 2014-04-03
  • 2017-05-12
  • 2015-09-01
相关资源
最近更新 更多