Boost python 防止可变类的自动哈希函数

Boost python 防止可变类的自动哈希函数,boost-python,Boost Python,Python只允许不可变对象的散列值。比如说, hash((1,2,3)) 有效,但是 hash([1,2,3]) 引发TypeError:不可损坏的类型:“list”。看。但是,当我通过通常的Booo::Python::CaseType函数包装Boost .cth+类中的一个C++类时,每个生成的Python类都有一个默认的散列函数,其中哈希值与对象在内存中的位置相关。在我的64位操作系统上,哈希值是位置除以8 当我向Python公开一个类时,它的成员可以更改为任何可变的数据结构,所以这是

Python只允许不可变对象的散列值。比如说,

hash((1,2,3))
有效,但是

hash([1,2,3])
引发TypeError:不可损坏的类型:“list”。看。但是,当我通过通常的Booo::Python::CaseType函数包装Boost .cth+类中的一个C++类时,每个生成的Python类都有一个默认的散列函数,其中哈希值与对象在内存中的位置相关。在我的64位操作系统上,哈希值是位置除以8


当我向Python公开一个类时,它的成员可以更改为任何可变的数据结构,所以这是一种非常常见的情况!,我不希望使用默认的哈希函数,但希望调用hash来引发与用户收到的Python自身可变数据类型相同的TypeError。特别是,用户不应该意外地将可变对象用作字典键。如何在C++代码中实现这一点?

我发现它是如何运行的:

boost::python::class_<MyClass>("MyClass")
  .setattr("__hash__", boost::python::object());

初始化时没有参数的boost::python::对象对应于None。在纯Python C API中禁用哈希生成的过程稍微复杂一些,如中所述。但是,上面的代码片段显然在boost::python中完成了这项工作。

我发现了它的工作原理:

boost::python::class_<MyClass>("MyClass")
  .setattr("__hash__", boost::python::object());

初始化时没有参数的boost::python::对象对应于None。在纯Python C API中禁用哈希生成的过程稍微复杂一些,如中所述。但是,上面的代码片段显然在boost::python中完成了这项工作。

附带说明:boost.python行为反映了python中类的默认行为,在python中,从idx派生的对象id开始,对象基本上是可散列的:

>>> hash(object())
8795488122377
>>> class MyClass(object): pass
... 
>>> hash(MyClass)
878579
>>> hash(MyClass())
8795488082665
>>> 

另请注意:Boost.Python行为反映了Python中类的默认行为,在Python中,从idx派生的对象id开始,对象基本上是可散列的:

>>> hash(object())
8795488122377
>>> class MyClass(object): pass
... 
>>> hash(MyClass)
878579
>>> hash(MyClass())
8795488082665
>>>