2015-04-21 54 views
1

我有一个库(朱古力),其具有以下定义:类型错误的Python

class NetSpec(object): 
    def __init__(self): 
     super(NetSpec, self).__setattr__('tops', OrderedDict()) 

    def __setattr__(self, name, value): 
     self.tops[name] = value 

    def __getattr__(self, name): 
     return self.tops[name] 

    def to_proto(self): 
     names = {v: k for k, v in self.tops.iteritems()} 
     autonames = {} 
     layers = OrderedDict() 
     for name, top in self.tops.iteritems(): 
      top.fn._to_proto(layers, names, autonames) 
     net = caffe_pb2.NetParameter() 
     net.layer.extend(layers.values()) 
     return net 

当我尝试调用使用n = caffe.NetSpec()我收到以下错误时:

File "../../python/caffe/layers.py", line 84, in __init__ 
    super(NetSpec, self).__setattr__('tops', OrderedDict()) 

TypeError: must be type, not None 

我检查SO-9698614SO-576169SO-489269但他们没有导致解决方案。我的课是一个新的类型,我看不出为什么它不工作。

完整跟踪:

Traceback (most recent call last): 

    File "<ipython-input-72-694741de221d>", line 1, in <module> 
    runfile('/home/shaunak/caffe-pr2086/examples/wine/classify.py', wdir='/home/shaunak/caffe-pr2086/examples/wine') 

    File "/home/shaunak/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 682, in runfile 
    execfile(filename, namespace) 

    File "/home/shaunak/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 78, in execfile 
    builtins.execfile(filename, *where) 

    File "/home/shaunak/caffe-pr2086/examples/wine/classify.py", line 26, in <module> 
    f.write(str(logreg('examples/hdf5_classification/data/train.txt', 10))) 

    File "/home/shaunak/caffe-pr2086/examples/wine/classify.py", line 18, in logreg 
    n = caffe.NetSpec() 

    File "../../python/caffe/layers.py", line 84, in __init__ 
    super(NetSpec, self).__setattr__('tops', OrderedDict()) 

TypeError: must be type, not None 
+0

它适合我。 –

+0

@MartijnPieters我重新检查了跟踪并取消了对库的更改。错误仍然是:'超(NetSpec,个体经营).__ SETATTR __( '冠',OrderedDict())' - 更新代码 – shaunakde

+1

@shaunakde:你设置'NetSpec'到'None'地方?或者在模块被清除时以其他方式运行此代码? –

回答

2

不知怎的,你成功地绑定到NetSpec某处None

>>> super(None, object()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: must be type, not None 

的错误指示NetSpec全球势必None

您也可以通过直接到该实例__dict__属性绕过NetSpec.__setattr__方法:

class NetSpec(object): 
    def __init__(self): 
     self.__dict__['tops'] = OrderedDict() 

从你的代码共享这可能是因为这是罪魁祸首:

from .layers import layers, params, NetSpec 

该进口caffe.layers但重新绑定caffe.layersLayers()实例。这个可能会然后触发Python再次删除该模块,因为还没有其他引用(取决于何时以及如何创建sys.modules引用),导致所有全局变量被重新设置为None(包括NetSpec)。

+0

我已经更新了堆栈轨道。不幸的是,从我的修补。 – shaunakde

+0

文件 “../../python/caffe/layers.py”,线84,在__init__ 自.__的dict __ [ '顶部'] = OrderedDict() 类型错误: 'NoneType' 对象不是可调用 – shaunakde

+0

@shaunakde :是的,因为** all **你的全局变量设置为'None'。包括'OrderedDict'。 –