facebookincubator / cinder

Cinder is Meta's internal performance-oriented production version of CPython.
https://trycinder.com
Other
3.43k stars 122 forks source link

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

Open LuKuangChen opened 2 years ago

LuKuangChen commented 2 years ago

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.

carljm commented 2 years ago

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.