mirror of
https://github.com/python/cpython.git
synced 2025-11-25 21:11:09 +00:00
#18600: add policy to add_string, and as_bytes and __bytes__ methods.
This was triggered by wanting to make the doctest in email.policy.rst pass; as_bytes and __bytes__ are clearly useful now that we have BytesGenerator. Also updated the Message docs to document the policy keyword that was added in 3.3.
This commit is contained in:
parent
3f58277382
commit
bb17d2b857
6 changed files with 160 additions and 21 deletions
|
|
@ -132,22 +132,50 @@ class Message:
|
|||
|
||||
def __str__(self):
|
||||
"""Return the entire formatted message as a string.
|
||||
This includes the headers, body, and envelope header.
|
||||
"""
|
||||
return self.as_string()
|
||||
|
||||
def as_string(self, unixfrom=False, maxheaderlen=0):
|
||||
def as_string(self, unixfrom=False, maxheaderlen=0, policy=None):
|
||||
"""Return the entire formatted message as a string.
|
||||
Optional `unixfrom' when True, means include the Unix From_ envelope
|
||||
header.
|
||||
|
||||
This is a convenience method and may not generate the message exactly
|
||||
as you intend. For more flexibility, use the flatten() method of a
|
||||
Generator instance.
|
||||
Optional 'unixfrom', when true, means include the Unix From_ envelope
|
||||
header. For backward compatibility reasons, if maxheaderlen is
|
||||
not specified it defaults to 0, so you must override it explicitly
|
||||
if you want a different maxheaderlen. 'policy' is passed to the
|
||||
Generator instance used to serialize the mesasge; if it is not
|
||||
specified the policy associated with the message instance is used.
|
||||
|
||||
If the message object contains binary data that is not encoded
|
||||
according to RFC standards, the non-compliant data will be replaced by
|
||||
unicode "unknown character" code points.
|
||||
"""
|
||||
from email.generator import Generator
|
||||
policy = self.policy if policy is None else policy
|
||||
fp = StringIO()
|
||||
g = Generator(fp, mangle_from_=False, maxheaderlen=maxheaderlen)
|
||||
g = Generator(fp,
|
||||
mangle_from_=False,
|
||||
maxheaderlen=maxheaderlen,
|
||||
policy=policy)
|
||||
g.flatten(self, unixfrom=unixfrom)
|
||||
return fp.getvalue()
|
||||
|
||||
def __bytes__(self):
|
||||
"""Return the entire formatted message as a bytes object.
|
||||
"""
|
||||
return self.as_bytes()
|
||||
|
||||
def as_bytes(self, unixfrom=False, policy=None):
|
||||
"""Return the entire formatted message as a bytes object.
|
||||
|
||||
Optional 'unixfrom', when true, means include the Unix From_ envelope
|
||||
header. 'policy' is passed to the BytesGenerator instance used to
|
||||
serialize the message; if not specified the policy associated with
|
||||
the message instance is used.
|
||||
"""
|
||||
from email.generator import BytesGenerator
|
||||
policy = self.policy if policy is None else policy
|
||||
fp = BytesIO()
|
||||
g = BytesGenerator(fp, mangle_from_=False, policy=policy)
|
||||
g.flatten(self, unixfrom=unixfrom)
|
||||
return fp.getvalue()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue