2012-03-11 16 views
0

私はdictをラップするカスタムクラスを作成しています。したがって、getitemを実装したいと思います。また、この辞書ではタプルをキーとして使用します。しかし、getitemにタプルを渡そうとすると、PythonはKeyErrorを投げます。__getitem __()のパラメータとしてタプルを使用する方法?

コード:

Class Board(object): 
    def __getitem__(self, key): 
    print "type in call: " + type(key) 
    return self.board[key] 

# in main somewhere 
board = Board() 

print "type before call: " + type((1, 2)) 
if (1, 2) in board: 
    print "It's there!" 

Ouptut:

type before call: <type 'tuple'> 
type in call: <type 'int'> 

## traceback stuff ## 
KeyError: 0 

ん会マッピングタイプを継承する必要があり、私はのGetItemにそれを渡したときに、それはintに私のタプルをキャストしているように見えますPythonが幸せになるためには?また、なぜPythonは最初にこのキャストを試みますか?

+0

メンバシップテストを実装しようとしていますが、[クラス内のメソッドの再宣言](http://stackoverflow.com/q/9428419/1132524)を見てください。 –

答えて

1

__contains__()が実装されていない限り、包含が反復されます。それで、実装してください。

+0

これは本当ではないので、最初の文章を言いたいことがあります。['__contains__' doc](http://docs.python.org/py3k/reference/datamodel.html#object.__contains__) –

+0

@Rik:" For '__contains __()'を定義していないオブジェクトの場合、メンバシップテストはまず '__iter __()'を介して繰り返しを行い、 '__getitem __()' ...を介して古いシーケンス反復プロトコルを試行します。 –

+0

あるいは、[collection ABCs](https://docs.python.org/2/library/collections.html#collections-abstract-base-classes)を参照して、Pythonが退屈な部分を実装できるようにします。 – Kevin

関連する問題