On Fri, 30 Oct 2015 at 22:57 Terry Reedy <tjreedy@udel.edu> wrote:
On 10/30/2015 9:19 PM, Guido van Rossum wrote:
> There's sys.builtin_module_names which returns the names of the
> hardcoded builtin modules.

Great.  With this solved, I opened an issue for IDLE.
https://bugs.python.org/issue25522

> Dynamically loaded modules can be found by
> searching sys.path in the usual way -- importlib shoul know. I wonder if
> just asking importlib whether it can locate a given module would be enough?

The default search order is stdlib builtins, local user files, /lib
files, so the shadowing issue the opposite for builtin and /lib modules.
  Hence a different message is needed.

Quick and dirty way to use importlib is to get the location of the stdlib (os.__file__ should work since it's hard-coded in the interpreter as representing where the stdlib is) and then use importlib.find_spec() for a module name to check if the file location in the spec has the same location prefix as os or not (make sure you use absolute paths since it isn't guaranteed if you don't execute site.py).

I've now seen this use case, the logging one, and the 2to3 module rename. I'm starting to wonder if there some general solution that should get added to the import machinery that  can serve these cases more easily than with importers or __import__ overrides that can be tricky to get right.

-Brett
 

> On Fri, Oct 30, 2015 at 6:09 PM, Terry Reedy
> <tjreedy@udel.edu
> <mailto:tjreedy@udel.edu>> wrote:
>
>     This idea results from issue of user files shadowing stdlib files on
>     import.  There was a thread on pydev about this yesterday.  There is
>     also an opposite issue of builtin modules shadowing user files.
>
>     The keyword module provides kwlist and iskeyword function.  One use
>     of kwlist is used in some other stdlib modules and can be used by
>     syntax highlighters (as in IDLE).  Kwlist is updated by the main
>     function.
>
>     A module module would have at least liblist and islibmodule
>     function. Liblist would contain all directories with __init__.py and
>     all .py files.  (I don't think files within package directories
>     should be included, as there is no direct shadowing problem.)  A
>     python oriented editor could then warn on save requests "This name
>     matches a stdlib name in /Lib. If you run python in this directory,
>     you will not be able to import the stdlib module.  Continue?".
>
>     The module should also have binlist and isbinmodule for builtin
>     modules.  (I do not know how to get such a list.  If necessary, an
>     api could be added.)  An editor could than warn "This name matches a
>     builtin stdlib name.  You will not be able to import this file.
>     Continue?".
>
>     --
>     Terry Jan Reedy
>
>     _______________________________________________
>     Python-ideas mailing list
>     Python-ideas@python.org
>     <mailto:Python-ideas@python.org>
>     https://mail.python.org/mailman/listinfo/python-ideas
>     Code of Conduct: http://python.org/psf/codeofconduct/
>
>
>
>
> --
> --Guido van Rossum (python.org/~guido <http://python.org/~guido>)
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>


--
Terry Jan Reedy

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/