On 2019-11-08 18:09, Brett Cannon wrote:


On Fri, Nov 8, 2019 at 10:01 AM Ricky Teachey <ri...@teachey.org <mailto:ri...@teachey.org>> wrote:

    throwing this idea out there, no idea if it is practical but it
    might be pretty nice/easily understood syntax.

    could a context manager be created such that anything imported under
    it is guaranteed to be imported from the standard library, and
    produce an error otherwise? perhaps by adding a level keyword
    argument to the __import__ built in.


__import__ already has a 'level' argument.


    something like:

    with __import__(level="std"):
         # imports guaranteed to fail of not in the standard library
         from pathlib import Path
         from sys import argv

    with __import__(level="package"):
         # imports guaranteed to fail of not in the current package
         import mod1
         import mod2

    with __import__(level="local"):
         # imports guaranteed to fail of not in the local directory
         import mod1
         import mod2

    with __import__(level="site"):
         # imports guaranteed to fail if not in site-packages, or some
    other definition that makes sense
         import numpy as np


Not without frame inspection to know what import statements are in the context manager's block.

This can all be done with code which calls importlib.import_module() and checks __spec__.origin to see where the module came from. Basically if you're willing to give up the syntax support of 'import' statements (which are just calls to __import__ with some assignments afterwards to bind things to names) you can have this protection today without adding syntax (which is always a massive ask).

If we were to add syntax, the best I think I can come up with is:

# imports guaranteed to fail of not in the standard library
from pathlib in std import Path
from sys in std import argv

# imports guaranteed to fail of not in the current package
import mod1 in package
import mod2 in package

# imports guaranteed to fail of not in the local directory
import mod1 in local
import mod2 in local

# imports guaranteed to fail if not in site-packages, or some other definition that makes sense
import numpy in site as np
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/P3YKINDLDGFKP7R7GH3NQ6OEIJH2MSVM/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to