facebookincubator / cinder

Cinder is Meta's internal performance-oriented production version of CPython.

Home Page:https://trycinder.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

What would it take to make unhashable dict key a static error?

LuKuangChen opened this issue · comments

commented

What version of Static Python are you using?

9965302
2021-07-15

What program did you run?

# compile_nested_dict_dict_key.py

from __static__ import CheckedDict

class B: pass

class D(B): pass

def testfunc():
    x = CheckedDict[B, int]({B():42, D():42})
    y = CheckedDict[CheckedDict[B, int], int]({x: 42})
    return y

print(testfunc())

What happened?

The program raises a runtime error.

TypeError: unhashable type: 'dict[B, int]'

What should have happened?

We expected a compile-time error complaining that CheckedDict[B, int] is unhashable. Maybe the type system can look for a __hash__ method.

We want it to be possible to use types that are not known to SP at compile time in a CheckedDict, in which case we cannot know if they are hashable. So I think the best that we could do here is opportunistically emit a static error if a type which is known to be not-hashable is used as CheckedDict key, but we can't prevent this runtime TypeError in all cases.