我正在使用标准的Python邮箱模块从Maildir中读取消息。读取后,我将解析它们并将结果存储在字典中。我已将此功能放入类中,并使用__getitems__启用程序的其他组件来访问它们。这很好,我很高兴我的代码既功能又可读。

我的问题是如何将它从一次解析一条消息的类转换为对Maildir中的每条消息进行迭代的对象。一个简单的解决方案是在主程序中放置一个for循环并使用mailbox.iterkeys:

inbox = mailbox.Maildir('Maildir')
for key in inbox.iterkeys():
    mailparse.process(inbox, key)


这行得通,但对我来说似乎并不整洁。我希望类中具有所有与maildir相关的功能,而不必将每个maildir密钥传递给它。就像是:

class mailparse():
    def __init__(self, mdirpath):
        inbox = mailbox.Maildir(mdirpath)

    def __getitems__(self, key):
        return self.dictionary[key]

    def process():
        for key in inbox.iterkeys()
            ....

for x in Mailprocess:
    ....


显然,我上面的代码无法正常工作,但我认为必须根据这些思路制定解决方案,以完全独立地包含类中的功能块。

最佳答案

我将以不同的方式进行设置。如果您确实想要一个可迭代的类来处理此问题,

class MailboxParser(object):
    def __init__(self, mbox):
        self.mbox = mbox

    def __getitem__(self, key):
        return self._process(key, self.mbox[key])

    def __iter__(self):
        for key, val in self.mbox.iteritems():
            yield self._process(key, val)

    def _process(self, key, content):
        """Do whatever on a single message"""


__iter__成员允许您执行

for x in MailboxParser(mbox):
    # now x is the result of processing a single message

09-04 18:50