2012-02-21 92 views
3

好了,所以我建立我自己的變量處理程序通過數據[關鍵]訪問數據時具有__getitem__功能的使用,它除了試圖訪問項目的鏈接時的偉大工程試圖訪問一個不存在的子鍵時,Python只是返回一個KeyError而不打印「子鍵」,爲什麼會這樣?我怎樣才能讓Python打印出我實際上想要得到的東西?Python - 詞典 - 修改__getitem__?</p> <pre><code>data["key"]["subkey"] def __getitem__(self, key, **args): print key ... return self.dict[key] </code></pre> <p>當:

我知道我可能誤解了機制,但有沒有一種方法來模擬字典並遵循所請求的數據字符串? 主要是讓我可以動態地記錄缺少的變量在字典中的流...

這顯然作品(但它不是我喜歡的原生語法):

data["key:subkey"] 

def __getitem__(self, key, **args): 
    for slice in key.split(':'): 
     print key 
    ... 

的目標是效仿以下,

作品:

data = {'key' : {'subkey' : 1}} 
print data["key"]["subkey"] 

不會工作,但我要趕內__getitem__異常,然後創建MI ssing鍵自動或只要登錄丟失的子項:

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'] 

輸出:

:測試

:下來

+0

我在這裏錯過了什麼,或者這樣做不值得讚賞嗎? downvoter可以解釋自己嗎? – Polynomial 2012-02-21 13:25:05

+0

'data'的類型是什麼? 'data [「key」]'是什麼類型的?您可能需要展示更多代碼 - 否則我們所能做的只是猜測。 (不是我的downvote) – 2012-02-21 13:27:31

+2

不,你不能直接做(你可以通過返回一個包裹對象做同樣的行爲)。可以這樣想:'_ = data ['key']'後面跟着'_''子鍵']'。如果這是訪問數據的有效方式,您可以選擇'data''key','subkey']'(元組鍵)。 – 2012-02-21 13:28:33

回答

5

事實是,當Python遇到像data["key"]["subkey"]這樣的表達式時,內部完成的是(data["key"])["subkey"]。也就是說,表達式的第一部分被解析:從對象「data」中檢索項「key」。然後,Python嘗試對該表達式的結果對象調用__getitem__。 如果這樣的結果對象本身沒有__getitem__方法,則會出現錯誤。

有兩種可能的解決方法有:你要麼用「元組指標」的工作 - 就像 data["key", "subkey"](然後測試你的__getitem__方法,無論您有一個元組實例作爲鍵) - 或使__getitem__返回一個專門的對象它還具有一個__getitem__方法 - 即使它只是記錄所請求的密鑰。

+0

所以這就是它的工作原理,我只是假定python會在第一個鍵後再次通過同一個變量實例自動調用__getitem__,我猜我必須返回我的變量句柄的第二個實例,以便第二個調用存在__getitem__ 。 謝謝! – Torxed 2012-02-21 13:36:01

4

記住:tmp = foo['bar']['baz']相同tmp = foo['bar']; tmp = tmp['baz']

所以允許任意深度的__getitem__方法必須返回一個新的對象,還包含這樣的__getitem__方法。

+0

我猜我必須從「變量處理程序」內返回我的變量句柄的第二個實例,以便__getitem__存在第二個調用以及那麼。 謝謝! – Torxed 2012-02-21 13:37:07

相關問題