Some extra comments and docstrings, and a new class (AddressList), all by ESR.
diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index 9631def..ade3506 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -55,6 +55,7 @@
 
 There are also some utility functions here.
 """
+# Cleanup and extensions by Eric S. Raymond <esr@thyrsus.com>
 
 import string
 import time
@@ -339,7 +340,12 @@
         return self.dict[string.lower(name)]
 
     def __setitem__(self, name, value):
-        """Set the value of a header."""
+        """Set the value of a header.
+
+        Note: This is not a perfect inversion of __getitem__, because 
+        any changed headers get stuck at the end of the raw-headers list
+        rather than where the altered header was.
+        """
         del self[name] # Won't fail if it doesn't exist
         self.dict[string.lower(name)] = value
         text = name + ": " + value
@@ -438,6 +444,9 @@
     
     To understand what this class does, it helps to have a copy of
     RFC-822 in front of you.
+
+    Note: this class interface is deprecated and may be removed in the future.
+    Use rfc822.AddressList instead.
     """
     
     def __init__(self, field):
@@ -687,6 +696,44 @@
         
         return plist
 
+class AddressList(AddrlistClass):
+    """An AddressList encapsulates a list of parsed RFC822 addresses."""
+    def __init__(self, field):
+        AddrlistClass.__init__(self, field)
+        if field:
+            self.addresslist = self.getaddrlist()
+        else:
+            self.addresslist = []
+
+    def __len__(self):
+        return len(self.addresslist)
+
+    def __str__(self):
+        return string.joinfields(map(dump_address_pair, self.addresslist),", ")
+
+    def __add__(self, other):
+        # Set union
+        newaddr = AddressList(None)
+        newaddr.addresslist = self.addresslist[:]
+        for x in other.addresslist:
+            if not x in self.addresslist:
+                newaddr.addresslist.append(x)
+        return newaddr
+
+    def __sub__(self, other):
+        # Set difference
+        newaddr = AddressList(None)
+        for x in self.addresslist:
+            if not x in other.addresslist:
+                newaddr.addresslist.append(x)
+        return newaddr
+
+def dump_address_pair(pair):
+    """Dump a (name, address) pair in a canonicalized form."""
+    if pair[0]:
+        return '"' + pair[0] + '" <' + pair[1] + '>'
+    else:
+        return pair[1]
 
 # Parse a date field