Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

posted at

updated at

-1を返すと-2が返る?

Pythonにはhash()という組み込み関数がありますが、上記動画によるとどうやら CPython においては戻り値が__hash__()の戻り値とは異なる事があるらしいです。試しに以下のcodeを実行してみると

# 環境 CPython 3.8.10
class T:
    def __hash__(self):
        return -1

obj = T()
print(hash(obj))  # => -2

確かに-2が出力されました。こうなるのはCPythonが内部で-1をerrorを表す特別な値として使っていてhash値として利用できず-2へすり替えるかららしいです。というわけで自前で算出したhash値を確実に得たいなら例えば以下のように別に関数を用意するなどの対策が要る。

class T:
    def hash(self):
        return -1
    def __hash__(self):
        return self.hash()

obj = T()
print(hash(obj))   # => -2
print(obj.hash())  # => -1
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?