Conditional import code relies on ImportError being raised when the module have not the requested member, not AttributeError.
$ python -c 'from time import wrongmember'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: cannot import name wrongmember
$ grumpy -c 'from time import wrongmember'
Traceback (most recent call last):
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/__main__.py", line 1, in <module>
AttributeError: 'module' object has no attribute 'wrongmember'
exit status 1
And import wrongmodule fails on compile time, instead of raising an ImportError on run time:
$ python -c 'import inexistantmodule'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named inexistantmodule
$ grumpy -c 'import inexistantmodule'
Traceback (most recent call last):
File "/Users/alanjds/.virtualenvs/gpy27/bin/grumpy", line 11, in <module>
load_entry_point('grumpy-tools', 'console_scripts', 'grumpy')()
File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 716, in __call__
return self.main(*args, **kwargs)
File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 696, in main
rv = self.invoke(ctx)
File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 1060, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 889, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 534, in invoke
return callback(*args, **kwargs)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/cli.py", line 84, in run
result = grumprun.main(stream=stream, modname=modname, pep3147=pep3147, clean_tempfolder=(not keep_main))
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/grumprun.py", line 114, in main
transpiled = grumpc.main(stream, modname=modname, pep3147=True, recursive=True)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/grumpc.py", line 153, in main
deps, import_objects = _collect_deps(script, modname, pep3147_folders, from_cache=(not will_refresh))
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/grumpc.py", line 83, in _collect_deps
with_imports=True,
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/pydeps.py", line 35, in main
imports = imputil.collect_imports(modname, script, gopath, package_dir=package_dir)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 213, in collect_imports
collector.visit(mod)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 41, in visit
return self._visit_one(obj)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 34, in _visit_one
return self.generic_visit(node)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 27, in generic_visit
self.visit(getattr(node, field_name))
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 39, in visit
return [self.visit(elt) for elt in obj]
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 41, in visit
return self._visit_one(obj)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 32, in _visit_one
return getattr(self, visit_attr)(node)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 195, in visit_Import
self.imports.extend(self.importer.visit(node))
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 41, in visit
return self._visit_one(obj)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 32, in _visit_one
return getattr(self, visit_attr)(node)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 101, in visit_Import
imp = self._resolve_import(node, alias.name)
File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 167, in _resolve_import
raise util.ImportError(node, 'no such module: {} (script: {})'.format(modname, self.script))
grumpy_tools.compiler.util.ImportError: line 1: no such module: inexistantmodule (script: /var/folders/50/nxn5kg1125g6mfml3sm2qgvh0000gn/T/tmpnvX_oz__pycache__/__main__.py)
Conditional import code relies on
ImportError
being raised when the module have not the requested member, notAttributeError
.And
import wrongmodule
fails on compile time, instead of raising an ImportError on run time: