Python:如何处理不可下载的对象?

时间:2011-05-12 11:19:08

标签: python methods dictionary subscript

我读过a thread on what a (non)subscriptable object is但它并没有告诉我我能做些什么。

我有一个代码调用mypost私有模块。目的是设置邮件帐户并执行此操作,我创建MailAccounts()模块中定义的mypost个对象。帐户数量及其各自的详细信息在配置文件中描述。当应用程序启动时,它会收集帐户信息并将其存储在字典中,其结构为:accounts = {service : { <MailAccounts Object at xxxxx> : {username : myusername, password : mypassword}}}其中service可以是“gmail”,其中MailAccounts是在mypost模块。 到现在为止还挺好。但是,当我想设置帐户时,我需要调用其方法: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>是字典键的事实有关吗?这使得它不可订阅(无论这意味着什么)?

这究竟是什么意思不可订阅?在这个例子中它意味着什么?当然:在这种情况下我如何解决/绕过这个?

谢谢, 本杰明:)

2 个答案:

答案 0 :(得分:4)

修复它的方法是正确使用词典。

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

答案 1 :(得分: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)