类型错误 Python Class
TypeError Python Class
我有一个具有以下定义的库 (caffe):
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-9698614,SO-576169 and SO-489269 但他们没有找到解决方案。我的 class 是一种新类型 class,我不明白为什么它不起作用。
完整跟踪:
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
你设法将 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.layers
重新绑定到 Layers()
实例。这个 可以 然后触发 Python 再次删除该模块,因为还没有其他对它的引用(取决于创建 sys.modules
引用的时间和方式),导致所有全局值反弹到 None
(包括 NetSpec
)。
我有一个具有以下定义的库 (caffe):
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-9698614,SO-576169 and SO-489269 但他们没有找到解决方案。我的 class 是一种新类型 class,我不明白为什么它不起作用。
完整跟踪:
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
你设法将 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.layers
重新绑定到 Layers()
实例。这个 可以 然后触发 Python 再次删除该模块,因为还没有其他对它的引用(取决于创建 sys.modules
引用的时间和方式),导致所有全局值反弹到 None
(包括 NetSpec
)。