2011-05-12 46 views
3

我讀過a thread on what a (non)subscriptable object is,但它並沒有告訴我我能做些什麼。Python:如何處理非可自定義的對象?

我有一個代碼調用mypost私有模塊。目標是設置郵件帳戶,並且爲此我創建mypost模塊中定義的MailAccounts()對象。帳戶數量及其各自詳細信息在配置文件中進行描述。當應用程序啓動時,它會收集帳戶信息並將其存儲在字典中,其結構如下:accounts = {service : { <MailAccounts Object at xxxxx> : {username : myusername, password : mypassword}}}其中service可以是「gmail」,其中MailAccountsmypost模塊中定義的類。 目前爲止這麼好。但是,如果我想設置帳戶,則需要調用其方法:MailAccounts.setupAccount(username, password)。我是通過遍歷字典的每個MailAccount對象做到這一點,並要求運行的方法:

for service in accounts: 
     for account in accounts[service]: 
      account.setupAccount(account['username'], account['password']) 

但正如你可能已經猜到它沒有工作,Python的返回:

TypeError: 'MailAccount' object is not subscriptable

如果我手動創建相同的帳戶但是它的工作原理:

account = MailAccount() 
account.setupAccount('myusername', 'mypassword') 

現在,我相信這是與事實,我<MailAccount Object at xxxx>是一個字典鍵右鍵?這使得它不具備可兌換性(無論這可能意味着什麼)?

沒有這到底意味着什麼是不可訂閱的?這個例子中的含義是什麼?當然:在這種情況下,我如何解決/繞過這個問題?

謝謝, 本傑明:)

+0

燦你向我們顯示填入「賬戶」的代碼,根據需要刪除任何敏感信息? – 2011-05-12 11:26:44

+0

@onteria:我現在有我的答案,你介意我是否跳過你的要求?謝謝。 – Benjamin 2011-05-12 11:38:41

回答

4

修復它是正確使用字典的方式。

for service in accounts: 
     for account, creds in accounts[service].iteritems(): 
      account.setupAccount(creds['username'], creds['password']) 
+0

謝謝。我理解你提出的代碼,但是我真的不明白它對Python有什麼不同?你能解釋一下嗎? – Benjamin 2011-05-12 11:27:04

+0

如果你想技術性的解釋,那麼, 「標化的對象」 是)一個,它的類定義一個或多個的'__getitem __(','__setitem __()'和'__delitem __()'方法。 http://docs.python.org/reference/datamodel.html#emulating-container-types – 2011-05-12 11:29:30

+1

@Benjamin:請始終使用'iterkeys','itervalues'和'iteritems'明確,你會避免混亂,你」重新從字典中獲得。在你原來的代碼中,'account'是一個MailAccount實例(一個鍵),而不是一個字典(一個值)。 – 2011-05-12 11:32:51

0

的問題是,當你遍歷一個字典,你得到的是字典的鍵,而不是項目。

>>> x = { 'a': 1, 'b': 2 } 
>>> for item in x: 
...  print(item) 
... 
a 
b 

如果要遍歷值,這樣做:

>>> for item in x.values(): 
...  print(item) 
... 
1 
2 

還有一個items方法,對鍵和值在同一時間:

>>> for item in x.items(): 
...  print(item) 
... 
('a', 1) 
('b', 2) 
相關問題