[Python-checkins] cpython: #20476: Deal with the message_factory circular import differently.
r.david.murray
python-checkins at python.org
Sat Sep 10 00:25:31 EDT 2016
https://hg.python.org/cpython/rev/8375b8d54bf7
changeset: 103547:8375b8d54bf7
user: R David Murray <rdmurray at bitdance.com>
date: Sat Sep 10 00:22:25 2016 -0400
summary:
#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.
files:
Doc/library/email.policy.rst | 4 ++--
Lib/email/_policybase.py | 2 +-
Lib/email/feedparser.py | 6 +++++-
Lib/email/message.py | 3 ---
Lib/test/test_email/test_policy.py | 2 +-
5 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst
--- a/Doc/library/email.policy.rst
+++ b/Doc/library/email.policy.rst
@@ -224,8 +224,8 @@
.. 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
diff --git a/Lib/email/_policybase.py b/Lib/email/_policybase.py
--- a/Lib/email/_policybase.py
+++ b/Lib/email/_policybase.py
@@ -155,6 +155,7 @@
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 @@
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):
diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py
--- a/Lib/email/feedparser.py
+++ b/Lib/email/feedparser.py
@@ -147,7 +147,11 @@
self.policy = policy
self._old_style_factory = False
if _factory is None:
- self._factory = policy.message_factory
+ if policy.message_factory is None:
+ from email.message import Message
+ self._factory = Message
+ else:
+ self._factory = policy.message_factory
else:
self._factory = _factory
try:
diff --git a/Lib/email/message.py b/Lib/email/message.py
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -1162,6 +1162,3 @@
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
diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py
--- a/Lib/test/test_email/test_policy.py
+++ b/Lib/test/test_email/test_policy.py
@@ -24,7 +24,7 @@
'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.
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list