2012-03-11 68 views
0

我在寫一個自定義的類來包裝字典。因此,我想爲它實現getitem。我也將在這個詞典中使用元組作爲鍵。然而,當我嘗試傳遞一個元組來getitem時,Python會拋出一個KeyError。它看起來像它的鑄造我的元組爲int,當我把它傳遞給的GetItem如何使用元組作爲__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 

確實董事會需要從一個映射類型繼承爲了讓Python快樂?另外,爲什麼Python會首先嚐試執行此操作?

+0

您正在嘗試實施成員資格測試,請查看[在課堂上的「重新聲明方法」(http://stackoverflow.com/q/9428419/1132524))。 – 2012-03-11 06:40:37

回答

1

除非實現了__contains__(),否則包含迭代。所以,實施它。

+0

也許你想重寫第一句,因爲它不是真的:['__contains__' doc](http://docs.python.org/py3k/reference/datamodel.html#object.__contains__) – 2012-03-11 06:39:16

+0

@Rik:「For沒有定義'__contains __()'的對象時,成員測試首先通過'__iter __()'嘗試迭代,然後通過'__getitem __()'...「嘗試迭代舊的序列迭代協議。 – 2012-03-11 06:43:20

+0

或者,[collection ABCs](https://docs.python.org/2/library/collections.html#collections-abstract-base-classes),讓Python爲你實現無聊的部分。 – Kevin 2015-01-15 00:59:56