[Python-Dev] [Python-checkins] cpython: Add a reset_name argument to importlib.util.module_to_load in order to

Brett Cannon brett at python.org
Sat Jun 1 00:37:13 CEST 2013


I realize this broke the buildbots. Missed part of a diff in the commit.
I'm trying to split a massive CL into reasonable commit sizes, so please be
patient.


On Fri, May 31, 2013 at 6:11 PM, brett.cannon <python-checkins at python.org>wrote:

> http://hg.python.org/cpython/rev/39cc1b04713e
> changeset:   83998:39cc1b04713e
> user:        Brett Cannon <brett at python.org>
> date:        Fri May 31 18:11:17 2013 -0400
> summary:
>   Add a reset_name argument to importlib.util.module_to_load in order to
> control whether to reset the module's __name__ attribute in case a
> reload is being done.
>
> files:
>   Doc/library/importlib.rst            |   6 +++++-
>   Lib/importlib/_bootstrap.py          |  14 +++++++++++++-
>   Lib/test/test_importlib/test_util.py |  12 ++++++++++++
>   3 files changed, 30 insertions(+), 2 deletions(-)
>
>
> diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
> --- a/Doc/library/importlib.rst
> +++ b/Doc/library/importlib.rst
> @@ -788,7 +788,7 @@
>
>     .. versionadded:: 3.3
>
> -.. function:: module_to_load(name)
> +.. function:: module_to_load(name, *, reset_name=True)
>
>      Returns a :term:`context manager` which provides the module to load.
> The
>      module will either come from :attr:`sys.modules` in the case of
> reloading or
> @@ -796,6 +796,10 @@
>      :attr:`sys.modules` occurs if the module was new and an exception was
>      raised.
>
> +    If **reset_name** is true and the module requested is being reloaded
> then
> +    the module's :attr:`__name__` attribute will
> +    be reset to **name**, else it will be left untouched.
> +
>      .. versionadded:: 3.4
>
>  .. decorator:: module_for_loader
> diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
> --- a/Lib/importlib/_bootstrap.py
> +++ b/Lib/importlib/_bootstrap.py
> @@ -493,8 +493,14 @@
>
>      """
>
> -    def __init__(self, name):
> +    def __init__(self, name, *, reset_name=True):
> +        """Prepare the context manager.
> +
> +        The reset_name argument specifies whether to unconditionally reset
> +        the __name__ attribute if the module is found to be a reload.
> +        """
>          self._name = name
> +        self._reset_name = reset_name
>
>      def __enter__(self):
>          self._module = sys.modules.get(self._name)
> @@ -508,6 +514,12 @@
>              # (otherwise an optimization shortcut in import.c becomes
> wrong)
>              self._module.__initializing__ = True
>              sys.modules[self._name] = self._module
> +        elif self._reset_name:
> +            try:
> +                self._module.__name__ = self._name
> +            except AttributeError:
> +                pass
> +
>          return self._module
>
>      def __exit__(self, *args):
> diff --git a/Lib/test/test_importlib/test_util.py
> b/Lib/test/test_importlib/test_util.py
> --- a/Lib/test/test_importlib/test_util.py
> +++ b/Lib/test/test_importlib/test_util.py
> @@ -55,6 +55,18 @@
>          else:
>              self.fail('importlib.util.module_to_load swallowed an
> exception')
>
> +    def test_reset_name(self):
> +        # If reset_name is true then module.__name__ = name, else leave
> it be.
> +        odd_name = 'not your typical name'
> +        created_module = imp.new_module(self.module_name)
> +        created_module.__name__ = odd_name
> +        sys.modules[self.module_name] = created_module
> +        with util.module_to_load(self.module_name) as module:
> +            self.assertEqual(module.__name__, self.module_name)
> +        created_module.__name__ = odd_name
> +        with util.module_to_load(self.module_name, reset_name=False) as
> module:
> +            self.assertEqual(module.__name__, odd_name)
> +
>
>  class ModuleForLoaderTests(unittest.TestCase):
>
>
> --
> Repository URL: http://hg.python.org/cpython
>
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130531/c1bf41a0/attachment.html>


More information about the Python-Dev mailing list