Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b067c8f

Browse files
committed
#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.
1 parent c7454ff commit b067c8f

5 files changed

Lines changed: 9 additions & 8 deletions

File tree

Doc/library/email.policy.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ added matters. To illustrate::
224224
.. attribute:: message_factory
225225

226226
A factory function for constructing a new empty message object. Used
227-
by the parser when building messages. Defaults to
228-
:class:`~email.message.Message`.
227+
by the parser when building messages. Defaults to ``None``, in
228+
which case :class:`~email.message.Message` is used.
229229

230230
.. versionadded:: 3.6
231231

Lib/email/_policybase.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta):
155155
serialized by a generator. Default: True.
156156
157157
message_factory -- the class to use to create new message objects.
158+
If the value is None, the default is Message.
158159
159160
"""
160161

@@ -163,7 +164,6 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta):
163164
cte_type = '8bit'
164165
max_line_length = 78
165166
mangle_from_ = False
166-
# XXX To avoid circular imports, this is set in email.message.
167167
message_factory = None
168168

169169
def handle_defect(self, obj, defect):

Lib/email/feedparser.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,11 @@ def __init__(self, _factory=None, *, policy=compat32):
147147
self.policy = policy
148148
self._old_style_factory = False
149149
if _factory is None:
150-
self._factory = policy.message_factory
150+
if policy.message_factory is None:
151+
from email.message import Message
152+
self._factory = Message
153+
else:
154+
self._factory = policy.message_factory
151155
else:
152156
self._factory = _factory
153157
try:

Lib/email/message.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,3 @@ def set_content(self, *args, **kw):
11621162
super().set_content(*args, **kw)
11631163
if 'MIME-Version' not in self:
11641164
self['MIME-Version'] = '1.0'
1165-
1166-
# Set message_factory on Policy here to avoid a circular import.
1167-
Policy.message_factory = Message

Lib/test/test_email/test_policy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class PolicyAPITests(unittest.TestCase):
2424
'cte_type': '8bit',
2525
'raise_on_defect': False,
2626
'mangle_from_': True,
27-
'message_factory': email.message.Message,
27+
'message_factory': None,
2828
}
2929
# These default values are the ones set on email.policy.default.
3030
# If any of these defaults change, the docs must be updated.

0 commit comments

Comments
 (0)