Python 类和迭代

标签 python class iteration

我正在使用标准 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:
    ....

显然我上面的代码不起作用,但我认为必须有一个解决方案,以完全独立包含类中的功能 block 。

最佳答案

我的设置非常不同。如果您确实想要一个可迭代的类来处理这个问题,

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

关于Python 类和迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9669738/

相关文章:

oop - 在类中使用 getter-setter

html - 在导航中显示 'active' 选项卡

php 类...验证

java - 为什么 Java 不在循环中存储条件值?

c - 递归到迭代 - Scheme to C

r - 创建不同大小和长度的 lavaan 和 irt 模型排列

python - 字符串操作,然后对其应用虚拟变量

python - 如何将现有环境克隆到anaconda中的基础环境

javascript - 了解 AJAX Post 请求到 Flask 端点期间的 400 错误

python - 来自 python 的 bash 命令