2

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 ++コードでこれをどのように達成できますか?

4

2 に答える 2

4

私はそれがどうなるかを知りました:

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

boost::python::object引数なしで初期化されるAはに対応しNoneます。純粋なPythonCAPIでハッシュ生成を無効にする手順は、Pythonのドキュメントで説明されているように、もう少し複雑です。ただし、上記のコードスニペットは明らかにboost::pythonで機能します。

于 2013-03-02T23:11:43.820 に答える
0

補足:Boost.Pythonの動作は、Pythonのクラスのデフォルトの動作を反映しており、オブジェクトは基本的にオブジェクトID(id(x)から派生)の時点でハッシュ可能です。

>>> hash(object())
8795488122377
>>> class MyClass(object): pass
... 
>>> hash(MyClass)
878579
>>> hash(MyClass())
8795488082665
>>> 
于 2015-04-20T13:35:49.187 に答える