簡體   English   中英

Python - 字典 - 修改__getitem__?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM