Make SWIG wrapped builtin class “hashable” in Python
我使用SWIG将C++库暴露给Python。出于性能方面的考虑,我希望将一些包装转换为使用swig的内置选项,这将删除python代理对象的层。
但是,包装类不能再在Python集合中使用,也不能用作Python dicts中的键。它是不可清洗的!
1 2 3 4 5 | >>> wrapped_object = WrappedObject() >>> hash(wrapped_object) Traceback (most recent call last): File"<stdin>", line 1, in <module> TypeError: unhashable type: 'structure.WrappedObject' |
我已经为我的类定义了
1 2 3 4 | >>> wrapped_object.__hash__ <built-in method __hash__ of structure.WrappedObject object at 0x7fa9e0e4c378> >>> wrapped_object.__eq__ <method-wrapper '__eq__' of structure.WrappedObject object at 0x7fa9e0e4c378> |
号
我需要做什么才能使这个类可散列?
对于内置对象,python使用散列槽(python docs link)而不是
在WrApDbObjultC++文件中:
1 | long WrappedObject::getHash(); |
在swig包装定义文件中:
1 2 | %rename(__hash__) WrappedObject::getHash; %feature("python:slot","tp_hash", functype="hashfunc") WrappedObject::getHash; |
号
这对我有用!