格式化自己,即一个字典。

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: 'number'

我本来希望format()通过__getitem__()获取它所需的属性。

如何让它工作?

2个回答

8
不,你需要使用self并支持更多的映射方法。
然而,最好使用属性访问的格式支持:
    def __str__(self):
        return """
Commit {0.number} {0.sha}
Message {0.message}
Identity {0.identity}
""".format(self)

现在它将使用属性访问从.format()的第一个位置参数self中查找numbermessage等内容。请注意保留HTML标记,但不要添加任何解释。

如果 identity 是一个字典,而我想要放入某些元素怎么办?下面这行代码是不起作用的:Identity: {0.identity['author_name']} <{0.identity['author_email']}> - Flavius
1
format()不理解引号,请尝试使用{0.identity[author_name]} - SingleNegationElimination
2
@Flavius:仔细阅读规范,你不需要使用引号。 :-) - Martijn Pieters

3

你有一个self.number,但想要访问self['number']。这是不同的……

试试用{0.number}代替...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接