[英]Python - Dictionary - Modify __getitem__?
好的,所以我構建了自己的變量處理程序,它具有__getitem__
函數,可以在通過數據[key]訪問數據時使用,除了在嘗試訪問項目鏈接時,它的效果很好:
data["key"]["subkey"]
def __getitem__(self, key, **args):
print key
...
return self.dict[key]
當試圖訪問一個不存在的子鍵時,Python只返回一個KeyError而不打印“subkey”,為什么會這樣,我怎樣才能讓Python打印出我實際想要獲得的內容?
我知道我可能誤解了這些機制,但有沒有辦法模擬字典並遵循所請求的數據字符串? 主要是因為我可以在字典流中動態記錄缺失的變量...
這顯然有效(但它不是我喜歡的原生語法):
data["key:subkey"]
def __getitem__(self, key, **args):
for slice in key.split(':'):
print key
...
目標是模仿以下,
作品:
data = {'key' : {'subkey' : 1}}
print data["key"]["subkey"]
將無法工作,但我想在__getitem__
捕獲異常,然后自動創建缺失的密鑰或只記錄丟失的子密鑰:
data = {'key' : {}}
print data["key"]["subkey"]
class Var():
def __init__(self):
self.dict = {'test' : {}}
def __getitem__(self, var, **args):
print ':',var
if var in self.dict:
v = Var(self.dict[var])
return v
print vHandle['test']['down']
輸出:
:測試
: 下
沒有
事實是,當Python遇到諸如data["key"]["subkey"]
類的表達式時,內部完成的是(data["key"])["subkey"]
。 也就是說,表達式的第一部分被解決:從對象“data”中檢索項“key”。 然后,Python嘗試在該表達式的結果對象上調用__getitem__
。 如果這樣的結果對象本身沒有__getitem__
方法,則會出現錯誤。
有兩種可能的解決方法:你應該使用“元組索引” - 比如data["key", "subkey"]
(然后測試你的__getitem__
方法,你得到一個元組實例作為鍵) - 或者使__getitem__
返回一個也具有__getitem__
方法的專用對象 - 即使它只是記錄所請求的密鑰。
請記住: tmp = foo['bar']['baz']
與tmp = foo['bar']; tmp = tmp['baz']
tmp = foo['bar']; tmp = tmp['baz']
因此,為了允許任意深度, __getitem__
方法必須返回一個也包含這樣一個__getitem__
方法的新對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.