Python:如何处理不可订阅的对象?

2024-09-22 14:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个调用mypost私有模块的代码。目的是设置邮件帐户,并为此创建在mypost模块中定义的MailAccounts()对象。账户数量及其各自的详细信息在配置文件中描述。当应用程序启动时,它收集帐户信息并将其存储在字典中,字典的结构是: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>是字典键是不是有关?这使得它不可订阅(无论这意味着什么)?

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

谢谢, 本杰明:)


Tags: 模块字典objectisserviceusername帐户account
2条回答

解决这个问题的方法是正确使用词典。

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

问题是当你在字典上迭代时,你得到的是字典的键,而不是条目。

>>> 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)

相关问题 更多 >