[Python-Dev] Document None values in sys.modules?

Brett Cannon brett at python.org
Fri Jul 24 19:50:22 CEST 2009


On Fri, Jul 24, 2009 at 10:39, Guido van Rossum <guido at python.org> wrote:

> Still works, at least in some old 3.1 I had lying around:
>
> $ python3.1
> Python 3.1a0 (py3k:70152, Mar  3 2009, 16:55:42)
> [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import sys
> >>> sys.modules['string'] = None
> >>> import string
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> ImportError: No module named string
> >>>
> $ python3.1
> Python 3.1a0 (py3k:70152, Mar  3 2009, 16:55:42)
> [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import string
> >>>
> $
>
> The experiment should be easily repeatable. :-)
>

=) Yes, the None raising ImportError semantics can be added easily and
codified as official import semantics in 3.1. I was talking about the "None
triggers another import as with relative imports" semantics and if there was
some rather convoluted way to trigger that. I am guessing not as that would
require a value of -1 for level which is no longer valid.

I will fix importlib in both 3.2 and 3.1.1. And speaking of fixing, should I
put the failing test in now and decorate it with unittest.expectedFailure
until I get around to fixing it?

-Brett



>
> --Guido
>
> On Thu, Jul 23, 2009 at 8:35 PM, Brett Cannon<brett at python.org> wrote:
> >
> >
> > On Thu, Jul 23, 2009 at 20:18, Guido van Rossum <guido at python.org>
> wrote:
> >>
> >> So, I guess, we'll live with it for a while longer. Given that it
> >> managed to evade our attention for so long, I think that's fine.
> >
> > Can someone double-check me that the semantics can even be triggered in
> 3.1?
> > I just tried and couldn't come up with anything. Heck, I quick search for
> a
> > Py_None comparison in 3.1's import.c turned up nothing useful (other than
> > mark_miss() is the function used to set None in sys.modules). We might
> have
> > actually already removed it or made it so that the semantics can't be
> > triggered.
> >
> >>
> >> I agree that there's no reason for a None result from loaders to be
> >> interpreted the same way, assuming that's not how it works ATM.
> >>
> >> And we can live with import and importlib differing on this in 3.1
> >> (though you could call it a bug in importlib and fix it for 3.1.1 --
> >> not sure if you were planning on that).
> >
> > I can if people can trigger the semantics somehow so I have a test to go
> by.
> > -Brett
> >
> >>
> >> --Guido
> >>
> >> On Thu, Jul 23, 2009 at 7:50 PM, Brett Cannon<brett at python.org> wrote:
> >> >
> >> >
> >> > On Thu, Jul 23, 2009 at 19:48, Benjamin Peterson <benjamin at python.org
> >
> >> > wrote:
> >> >>
> >> >> 2009/7/23 Brett Cannon <brett at python.org>:
> >> >> >
> >> >> >
> >> >> > On Thu, Jul 23, 2009 at 19:38, Benjamin Peterson
> >> >> > <benjamin at python.org>
> >> >> > wrote:
> >> >> >>
> >> >> >> 2009/7/23 Brett Cannon <brett at python.org>:
> >> >> >> > None in Python 3.1 is really useless in terms of its semantics
> in
> >> >> >> > relative
> >> >> >> > imports; importlib doesn't support it and still passes as
> >> >> >> > __import__
> >> >> >> > (at
> >> >> >> > least last time I ran the test suite that way). I thought we had
> >> >> >> > agreed
> >> >> >> > a
> >> >> >> > while back that supporting None was not warranted in Python 3.0?
> >> >> >> > Otherwise I
> >> >> >> > will do whatever work is necessary for this to happen.
> >> >> >>
> >> >> >> I think it's still nice for the rare cases where you need to trick
> a
> >> >> >> module into thinking another one doesn't exist.
> >> >> >
> >> >> > But None does not strictly mean "I don't exist". None is supposed
> to
> >> >> > trigger
> >> >> > an another import attempt for the module with a top-level name.
> It's
> >> >> > that
> >> >> > extra import trigger that has no real use in 3.0 and just
> complicates
> >> >> > import
> >> >> > semantics (IMO) needlessly. If you want a module to not exist then
> >> >> > you
> >> >> > either stick something else in (e.g. '42') or we remove the special
> >> >> > semantics for None (which I thought we had).
> >> >>
> >> >>
> >> >> I didn't realize None had other semantics attached to it. (Imagine
> >> >> that dealing with import!) +1 for making it simply indicate an
> >> >> ImportError.
> >> >
> >> > I'm +0 with having import raise ImportError if None is set in
> >> > sys.modules as
> >> > long as we don't suddenly expect loaders to trigger the same thing if
> >> > they
> >> > return None (actually, as of right now what loaders return count for
> >> > nothing, but just want to be clear).
> >> > -Brett
> >>
> >>
> >>
> >> --
> >> --Guido van Rossum (home page: http://www.python.org/~guido/)
> >
> >
>
>
>
> --
> --Guido van Rossum (home page: http://www.python.org/~guido/)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20090724/ee23d5d7/attachment.htm>


More information about the Python-Dev mailing list