4

(非)添字可能オブジェクトとは何かに関するスレッドを読みましたが、それについて何ができるかはわかりません。

mypostプライベート モジュールを呼び出すコードがあります。目的は、メール アカウントを設定することです。これを行うには、モジュールMailAccounts()で定義されたオブジェクトを作成します。mypostアカウントの数とそれぞれの詳細は、構成ファイルに記述されています。アプリケーションが起動すると、アカウント情報が収集され、ディクショナリに保存されます。その構造は次のとおりです。「gmail」はどこaccounts = {service : { <MailAccounts Object at xxxxx> : {username : myusername, password : mypassword}}}で、モジュールで定義されたクラスはどこです。ここまでは順調ですね。ただし、アカウントをセットアップしたい場合は、そのメソッドを呼び出す必要があります: . これを行うには、辞書の各 MailAccount オブジェクトを反復処理し、メソッドの実行を要求します。serviceMailAccountsmypostMailAccounts.setupAccount(username, password)

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>辞書のキーであるという事実と関係があると思いますよね?それはそれを添字不可にします(それが何を意味するにせよ)?

いいえ、添字不可とは正確にはどういう意味ですか? この例では何を意味しますか? そしてもちろん、この場合、どうすればこれを解決/回避できますか?

ありがとう、ベンジャミン:)

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 に答える