]> granicus.if.org Git - python/commitdiff
#20476: Deal with the message_factory circular import differently.
authorR David Murray <rdmurray@bitdance.com>
Sat, 10 Sep 2016 04:22:25 +0000 (00:22 -0400)
committerR David Murray <rdmurray@bitdance.com>
Sat, 10 Sep 2016 04:22:25 +0000 (00:22 -0400)
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.

Doc/library/email.policy.rst
Lib/email/_policybase.py
Lib/email/feedparser.py
Lib/email/message.py
Lib/test/test_email/test_policy.py

index b345683520b25bc8ec9515e3f00be599bddd54b3..8a418778b8e0fcabcbdb70a6ad997cfc5a560c75 100644 (file)
@@ -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
 
index d6994844e18acf605e27d70e9f9e4157e9271552..df4649676aed72418864b87494a215fde74cd4ed 100644 (file)
@@ -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):
index 3d74978cdbbbbc9e2caed23a33e0f209de8e68c9..7c07ca86457a2aae626ebcee0c4cb024b5d70ed6 100644 (file)
@@ -147,7 +147,11 @@ class FeedParser:
         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:
index f4380d931ab86b9087fce2c73be41e451f3fb0a1..b6512f2198af43fcdde27d5559fad50d3853d81c 100644 (file)
@@ -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
index 1d95d03bf5f81794776696ec5d60370c38517e77..8fecb8a5fcd5a8283c77153cb04f31322bcea43e 100644 (file)
@@ -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.