2015-04-21 72 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'。 –