What would it take to make unhashable dict key a static error?
LuKuangChen opened this issue · comments
KC Lu 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.
Carl Meyer commented
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.