keyの型チェックしたいという話ではないんでしょうか?
Python
1class TupleDict(dict):
2 def __init__(self):
3 super().__init__()
4
5 def __setitem__(self, key, value):
6 TupleDict.__check_key(key)
7 super().__setitem__(key, value)
8
9 # もし要素の参照でkeyがtupleでない場合にもValueErrorにしたいなら以下のように
10
11 def __getitem__(self, key):
12 try:
13 return super().__getitem__(key)
14 except KeyError as e:
15 TupleDict.__check_key(key)
16 raise e
17
18 @staticmethod
19 def __check_key(key):
20 if not isinstance(key, tuple):
21 raise ValueError("key should be a tuple but was " + str(type(key)))
22
23d = TupleDict()
24d[(1, 2)] = 'a' # OK
25d[1] = 2 # ValueError
26d[(1, 2)] # OK('a')
27d[(2, 2)] # KeyError
28d[1] # KeyErrorではなくValueErrorとなる
29
上記以外にもオーバーライドすべき関数があるかも知れません。それはPythonのリファレンスをよく読めばわかるのではないかと思います。
ちなみに上の目的ならTypeErrorの方が素直な気がしなくもありません。