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
|
.. attribute:: message_factory
|
||||||
|
|
||||||
A factory function for constructing a new empty message object. Used
|
A factory function for constructing a new empty message object. Used
|
||||||
by the parser when building messages. Defaults to
|
by the parser when building messages. Defaults to ``None``, in
|
||||||
:class:`~email.message.Message`.
|
which case :class:`~email.message.Message` is used.
|
||||||
|
|
||||||
.. versionadded:: 3.6
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,7 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta):
|
||||||
serialized by a generator. Default: True.
|
serialized by a generator. Default: True.
|
||||||
|
|
||||||
message_factory -- the class to use to create new message objects.
|
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'
|
cte_type = '8bit'
|
||||||
max_line_length = 78
|
max_line_length = 78
|
||||||
mangle_from_ = False
|
mangle_from_ = False
|
||||||
# XXX To avoid circular imports, this is set in email.message.
|
|
||||||
message_factory = None
|
message_factory = None
|
||||||
|
|
||||||
def handle_defect(self, obj, defect):
|
def handle_defect(self, obj, defect):
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,10 @@ class FeedParser:
|
||||||
self.policy = policy
|
self.policy = policy
|
||||||
self._old_style_factory = False
|
self._old_style_factory = False
|
||||||
if _factory is None:
|
if _factory is None:
|
||||||
|
if policy.message_factory is None:
|
||||||
|
from email.message import Message
|
||||||
|
self._factory = Message
|
||||||
|
else:
|
||||||
self._factory = policy.message_factory
|
self._factory = policy.message_factory
|
||||||
else:
|
else:
|
||||||
self._factory = _factory
|
self._factory = _factory
|
||||||
|
|
|
||||||
|
|
@ -1162,6 +1162,3 @@ class EmailMessage(MIMEPart):
|
||||||
super().set_content(*args, **kw)
|
super().set_content(*args, **kw)
|
||||||
if 'MIME-Version' not in self:
|
if 'MIME-Version' not in self:
|
||||||
self['MIME-Version'] = '1.0'
|
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',
|
'cte_type': '8bit',
|
||||||
'raise_on_defect': False,
|
'raise_on_defect': False,
|
||||||
'mangle_from_': True,
|
'mangle_from_': True,
|
||||||
'message_factory': email.message.Message,
|
'message_factory': None,
|
||||||
}
|
}
|
||||||
# These default values are the ones set on email.policy.default.
|
# These default values are the ones set on email.policy.default.
|
||||||
# If any of these defaults change, the docs must be updated.
|
# If any of these defaults change, the docs must be updated.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue