mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
#20476: Deal with the message_factory circular import differently.
It turns out we can't depend on email.message getting imported every place message_factory is needed, so to avoid a circular import we need to special case Policy.message_factory=None in the parser instead of using monkey patching. I had a feeling that was a bad idea when I did it.
This commit is contained in:
parent
c7454ff5fc
commit
b067c8fdd1
5 changed files with 9 additions and 8 deletions
|
|
@ -224,8 +224,8 @@ added matters. To illustrate::
|
|||
.. attribute:: message_factory
|
||||
|
||||
A factory function for constructing a new empty message object. Used
|
||||
by the parser when building messages. Defaults to
|
||||
:class:`~email.message.Message`.
|
||||
by the parser when building messages. Defaults to ``None``, in
|
||||
which case :class:`~email.message.Message` is used.
|
||||
|
||||
.. versionadded:: 3.6
|
||||
|
||||
|
|
|
|||
|
|
@ -155,6 +155,7 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta):
|
|||
serialized by a generator. Default: True.
|
||||
|
||||
message_factory -- the class to use to create new message objects.
|
||||
If the value is None, the default is Message.
|
||||
|
||||
"""
|
||||
|
||||
|
|
@ -163,7 +164,6 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta):
|
|||
cte_type = '8bit'
|
||||
max_line_length = 78
|
||||
mangle_from_ = False
|
||||
# XXX To avoid circular imports, this is set in email.message.
|
||||
message_factory = None
|
||||
|
||||
def handle_defect(self, obj, defect):
|
||||
|
|
|
|||
|
|
@ -147,6 +147,10 @@ class FeedParser:
|
|||
self.policy = policy
|
||||
self._old_style_factory = False
|
||||
if _factory is None:
|
||||
if policy.message_factory is None:
|
||||
from email.message import Message
|
||||
self._factory = Message
|
||||
else:
|
||||
self._factory = policy.message_factory
|
||||
else:
|
||||
self._factory = _factory
|
||||
|
|
|
|||
|
|
@ -1162,6 +1162,3 @@ class EmailMessage(MIMEPart):
|
|||
super().set_content(*args, **kw)
|
||||
if 'MIME-Version' not in self:
|
||||
self['MIME-Version'] = '1.0'
|
||||
|
||||
# Set message_factory on Policy here to avoid a circular import.
|
||||
Policy.message_factory = Message
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class PolicyAPITests(unittest.TestCase):
|
|||
'cte_type': '8bit',
|
||||
'raise_on_defect': False,
|
||||
'mangle_from_': True,
|
||||
'message_factory': email.message.Message,
|
||||
'message_factory': None,
|
||||
}
|
||||
# These default values are the ones set on email.policy.default.
|
||||
# If any of these defaults change, the docs must be updated.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue