5
我有很多C/C++类使用Swig导出到python。我注意到,默认情况下,Swig不会为包装类生成__hash__
方法,因此将使用默认哈希,即包装对象的ID(即其内存地址或类似的东西)。这意味着如果我最终得到两个包装相同C对象的python对象,它们会在字典中以不同的方式散列等等,这很奇怪,会导致难以找到的错误。有没有办法扩展swig/python中的所有类?
我可以很容易地用一个更好的__hash__
扩展任何类:
%extend Foo {
bool __eq__(const Foo &other) { return $self == &other; }
bool __ne__(const Foo &other) { return $self != &other; }
long __hash__() { return (long) $self; } // hash: just address of C struct
}
(我也觉得情商应该是默认比较基于C结构地址,而不是包装的地址。)
我问题是:有什么办法可以告诉Swig扩展所有这样的类吗?或者我必须一次只做一个吗?
我想第二个问题是:为什么不自动执行此操作?默认行为是否有用?我不觉得它是。
我对Swig几乎一无所知,所以这只是对“次要问题”的回答。我怀疑Swig什么都不做,你看到的默认行为来自Python的'object'类型。默认情况下,Python中所有自定义类型的实例都是可散列的,其散列基于对象的标识。如果你需要其他的语义,你必须重写'__hash__'到'None'(来禁用散列)或者一个自定义的方法。 – Blckknght
你能说 '%extend ClassA,ClassB,ClassC {...}' ? – bluedog