4

我读过一个关于什么是(非)可订阅对象的线程,但它并没有告诉我我能做些什么。

我有一个调用mypost私有模块的代码。目的是设置邮件帐户,为此我创建了模块MailAccounts()中定义的对象。mypost帐户数量及其各自的详细信息在配置文件中进行了描述。当应用程序启动时,它会收集帐户信息并将其存储在字典中,其结构是: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')

现在我认为这与 my<MailAccount Object at xxxx>是字典键有关吗?这使它不可下标(无论这意味着什么)?

不,这到底意味着什么不可下标?在这个例子中它意味着什么?当然:在这种情况下,我该如何解决/绕过这个问题?

谢谢,本杰明:)

4

2 回答 2

5

解决它的方法是正确使用字典。

for service in accounts:
        for account, creds in accounts[service].iteritems():
            account.setupAccount(creds['username'], creds['password'])
于 2011-05-12T11:24:15.403 回答
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)
于 2011-05-12T11:28:37.473 回答