[issue30436] importlib.find_spec raises AttributeError/ModuleNotFoundError when parent is not a package/module

2017-05-23 Thread tkhyn

tkhyn added the comment:

Ok, thanks for the reply. Actually the thing that bothered me was the 
AttributeError exception. I would probably not have opened a ticket should 
find_spec have raised a ModuleNotFoundError (in line with import_module).

Would you consider catching the AttributeError (which means detecting if 
parent_name relates to a package) to raise a ModuleNotFoundError instead more 
appropriate?

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue30436] importlib.find_spec raises AttributeError/ModuleNotFoundError when parent is not a package/module

2017-05-23 Thread Brett Cannon

Brett Cannon added the comment:

The key thing to think about is do you think find_spec("parent.module") is 
working with a single thing called "parent.module" or is it working with two 
separate things of "parent" and "module" which happens to be contained on 
"parent"? If you take the former view then you get the current semantics, but 
if you view it as the latter then you get the semantics you're suggesting, 
tkhyn.

My inclination is for the former semantics (i.e. think of it as a really long 
name for a specific module where it turns out the name is broken). If you look 
at it as find_spec(".submodule", package="parent") this also visually supports 
the idea that parent modules shouldn't trigger a None return. Finally, this 
would break any code that expects the current semantics.

So thanks for the bug report, but I'm going to close this as "not a bug".

--
nosy: +brett.cannon, eric.snow, ncoghlan
resolution:  -> not a bug
stage:  -> resolved
status: open -> closed
type:  -> behavior

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue30436] importlib.find_spec raises AttributeError/ModuleNotFoundError when parent is not a package/module

2017-05-22 Thread tkhyn

New submission from tkhyn:

Hello, I stumbled upon this issue when using the module_has_submodule function 
in Django, which raised an exception when trying to import a dotted path such 
as ``parent.module`` when ``parent`` does not exist or is not a package. I 
would expect (as well as the django devs, apparently) find_spec to return None 
instead of raising an AttributeError or ModuleNotFoundError. 

Unless you think Django or any package making use of importlib.find_spec should 
handle these exceptions, the fix is quite simple.

Steps to reproduce (with Python 3.6.1):

touch parent.py
python3.6
>>> from importlib.util import find_spec
>>> find_spec('parent.module')
  File "C:\Python\3.6\Lib\importlib\util.py", line 89, in find_spec
return _find_spec(fullname, parent.__path__)
AttributeError: module 'parent' has no attribute '__path__'
>>> find_spec('invalid_parent.module')
  File "C:\Python\3.6\Lib\importlib\util.py", line 88, in find_spec
parent = __import__(parent_name, fromlist=['__path__'])
ModuleNotFoundError: No module named 'invalid_parent'

The fix is quite simple, replacing

if fullname not in sys.modules:
parent_name = fullname.rpartition('.')[0]
if parent_name:
# Use builtins.__import__() in case someone replaced it.

parent = __import__(parent_name, fromlist=['__path__'])
return _find_spec(fullname, parent.__path__)



else:

return _find_spec(fullname, None)
by:

if fullname not in sys.modules:
parent_name = fullname.rpartition('.')[0]
if parent_name:
# Use builtins.__import__() in case someone replaced it.
try:
parent = __import__(parent_name, fromlist=['__path__']).__path__

except (AttributeError, ModuleNotFoundError):
# parent is not a package
return None
else:
parent = None
return _find_spec(fullname, parent)


in importlib.util.find_spec.

--
components: Library (Lib)
messages: 294209
nosy: tkhyn
priority: normal
severity: normal
status: open
title: importlib.find_spec raises AttributeError/ModuleNotFoundError when 
parent is not a package/module
versions: Python 3.6

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com