diff options
author | R David Murray <rdmurray@bitdance.com> | 2012-05-25 22:42:14 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2012-05-25 22:42:14 (GMT) |
commit | 0b6f6c82b51b7071d88f48abb3192bf3dc2a2d24 (patch) | |
tree | d6bd5f56722b8fff6db8bdf39b47b1c4a87a3d42 /Lib/email/_policybase.py | |
parent | 0fa2edd08f7b2b028f61a22fab9a648d58699c0b (diff) | |
download | cpython-0b6f6c82b51b7071d88f48abb3192bf3dc2a2d24.zip cpython-0b6f6c82b51b7071d88f48abb3192bf3dc2a2d24.tar.gz cpython-0b6f6c82b51b7071d88f48abb3192bf3dc2a2d24.tar.bz2 |
#12586: add provisional email policy with new header parsing and folding.
When the new policies are used (and only when the new policies are explicitly
used) headers turn into objects that have attributes based on their parsed
values, and can be set using objects that encapsulate the values, as well as
set directly from unicode strings. The folding algorithm then takes care of
encoding unicode where needed, and folding according to the highest level
syntactic objects.
With this patch only date and time headers are parsed as anything other than
unstructured, but that is all the helper methods in the existing API handle.
I do plan to add more parsers, and complete the set specified in the RFC
before the package becomes stable.
Diffstat (limited to 'Lib/email/_policybase.py')
-rw-r--r-- | Lib/email/_policybase.py | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/Lib/email/_policybase.py b/Lib/email/_policybase.py index 05736d0..6bc298b 100644 --- a/Lib/email/_policybase.py +++ b/Lib/email/_policybase.py @@ -64,10 +64,16 @@ class _PolicyBase: except for the changes passed in as keyword arguments. """ + newpolicy = self.__class__.__new__(self.__class__) for attr, value in self.__dict__.items(): - if attr not in kw: - kw[attr] = value - return self.__class__(**kw) + object.__setattr__(newpolicy, attr, value) + for attr, value in kw.items(): + if not hasattr(self, attr): + raise TypeError( + "{!r} is an invalid keyword argument for {}".format( + attr, self.__class__.__name__)) + object.__setattr__(newpolicy, attr, value) + return newpolicy def __setattr__(self, name, value): if hasattr(self, name): |