25

私が辞書を持っているとしましょう:

>>> d = {}

メソッドがありますclear()

>>> d.clear
<built-in method clear of dict object at 0x7f209051c988>

...__hash__属性があります:

>>> d.clear.__hash__
<method-wrapper '__hash__' of builtin_function_or_method object at 0x7f2090456288>

...呼び出し可能です:

>>> callable(d.clear.__hash__)
True

では、なぜハッシュ化できないのでしょうか。

>>> hash(d.clear)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

注:オブジェクトがハッシュ化できないことは知っていdictます。前述のように、オブジェクトはハッシュ化できないと主張しているように見えますが、なぜこの制限がオブジェクトのメソッドにも適用されるのか興味があります。

4

2 に答える 2

33

これはバインドされたメソッドであり、バインドされたメソッドにはself、たとえば辞書への参照があります。これにより、メソッドがハッシュ不可になります。

バインドされていないメソッドをハッシュできます。dict.clear

>>> d = {}
>>> d.clear.__self__
{}
>>> d.clear.__self__ is d
True
>>> hash(d.clear)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> hash(dict.clear)
-9223372036586189204

ハッシュ可能なインスタンスのメソッドはそれ自体ハッシュ可能であるため、組み込みのバインドされたメソッドのオブジェクト型はメソッドを実装し__hash__ますがTypeError__self__属性がハッシュ可能でない場合に発生します。object.__hash__これはメソッドのドキュメントと一致しています。設定できる場合、Noneまたはまったく実装しない場合は、それが望ましいですが、ハッシュ可能性が実行時にのみ知られているこれらのケースでは、 a を上げることTypeErrorが唯一のオプションです。

于 2015-03-24T17:27:43.843 に答える