[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