Pythonは、不変オブジェクトに対してのみハッシュ値を許可します。例えば、
hash((1,2,3))
動作しますが
hash([1,2,3])
を発生させTypeError: unhashable type: 'list'
ます。Pythonのドキュメントを参照してください。ただし、通常の関数を使用してC ++クラスをBoost.Pythonでラップすると、boost::python::class_<>
生成されたすべてのPythonクラスにデフォルトのハッシュ関数があり、ハッシュ値はメモリ内のオブジェクトの場所に関連付けられます。(私の64ビットOSでは、ハッシュ値は場所を8で割ったものです。)
メンバーを変更できるクラスをPythonに公開すると(可変データ構造なので、これは非常に一般的な状況です!)、デフォルトのハッシュ関数は必要ありませんが、ユーザーがPython自体に対して受け取るhash()
のと同じように呼び出す呼び出しが必要です。TypeError
可変データ型。特に、ユーザーが誤って可変オブジェクトを辞書キーとして使用できないようにする必要があります。C ++コードでこれをどのように達成できますか?