3

format(self)この場合、どのように機能させるのですか?

class Commit:
    number = None
    sha = None
    message = None
    identity = None

    def __init__(self, raw, number):
        r = raw.commits[number]

        self.number = number
        self.sha = r['sha']
        self.message = r['message']
        self.identity = raw.identities[r['identity']]

    def __str__(self):
        return """
Commit {number} {sha}
Message {message}
Identity {identity}
""".format(self)

    def __getitem__(self, attr):
        return getattr(self, attr)
    def __contains__(self, attr):
        return hasattr(self, attr)

次に、個々の属性にアクセスしようとすると

c = Commit(raw, 170)
print(c['sha'])

たとえば、それは機能します。ただし、print(c)直接言うと、次のようになります。

KeyError: '数値'

format()を介して必要な属性を取得することを期待していました__getitem__()

それを機能させる方法は?

4

2 に答える 2

8

いいえ、**selfより多くのマッピング方法を使用してサポートする必要があります。

ただし、代わりに属性アクセスの形式サポートを使用する方がはるかに優れています。

    def __str__(self):
        return """
Commit {0.number} {0.sha}
Message {0.message}
Identity {0.identity}
""".format(self)

これで、属性アクセスを使用して、最初の位置引数から、つまりまでnumber、などを検索します。message.format()self

于 2012-12-18T12:39:40.380 に答える
3

を持っているがself.number、アクセスしたいself['number']。これは別格…

代わりに試してください{0.number}...

于 2012-12-18T12:40:24.613 に答える