Mercurial > public > mercurial-scm > hg
diff mercurial/demandimport.py @ 30647:1914db1b7d9e stable
demandimport: do not raise ImportError for unknown item in fromlist
This is the behavior of the default __import__() function, which doesn't
validate the existence of the fromlist items. Later on, the missing attribute
is detected while processing the import statement.
https://hg.python.org/cpython/file/v2.7.13/Python/import.c#l2575
The comtypes library relies on this (maybe) undocumented behavior, and we
got a bug report to TortoiseHg, sigh.
https://bitbucket.org/tortoisehg/thg/issues/4647/
The test added at 26a4e46af2bc verifies the behavior of the import statement,
so this patch only adds the test of __import__() function and works around
CPython/PyPy difference.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 19 Dec 2016 22:46:00 +0900 |
parents | 75c71c533977 |
children | f80d9ddc40f3 |
line wrap: on
line diff
--- a/mercurial/demandimport.py Thu Dec 08 23:59:36 2016 +0800 +++ b/mercurial/demandimport.py Mon Dec 19 22:46:00 2016 +0900 @@ -199,8 +199,11 @@ nonpkg = getattr(mod, '__path__', nothing) is nothing if symbol is nothing: if nonpkg: - # do not try relative import, which would raise ValueError - raise ImportError('cannot import name %s' % attr) + # do not try relative import, which would raise ValueError, + # and leave unknown attribute as the default __import__() + # would do. the missing attribute will be detected later + # while processing the import statement. + return mn = '%s.%s' % (mod.__name__, attr) if mn in ignore: importfunc = _origimport