diff options
author | Éric Araujo <merwok@netwok.org> | 2011-10-19 06:46:13 +0200 |
---|---|---|
committer | Éric Araujo <merwok@netwok.org> | 2011-10-19 06:46:13 +0200 |
commit | 8ccd18fff334b9b9a32e9662684f59cac332c524 (patch) | |
tree | fc791ef84f973171ca049f21694c6f04c3a62d4e /Lib/packaging/util.py | |
parent | 4f996449bf9364f9c21fa6bfb0e8363e96987179 (diff) | |
download | cpython-git-8ccd18fff334b9b9a32e9662684f59cac332c524.tar.gz |
Expand tests and fix bugs in packaging.util.resolve_name.
The code is still ugly, but at least it works better now. Patches to
make it easier to read are welcome, as well as support in #12915.
Diffstat (limited to 'Lib/packaging/util.py')
-rw-r--r-- | Lib/packaging/util.py | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py index f8a805844e..2af1149669 100644 --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -630,22 +630,35 @@ def find_packages(paths=(os.curdir,), exclude=()): def resolve_name(name): """Resolve a name like ``module.object`` to an object and return it. - Raise ImportError if the module or name is not found. + This functions supports packages and attributes without depth limitation: + ``package.package.module.class.class.function.attr`` is valid input. + However, looking up builtins is not directly supported: use + ``builtins.name``. + + Raises ImportError if importing the module fails or if one requested + attribute is not found. """ + if '.' not in name: + # shortcut + __import__(name) + return sys.modules[name] + + # FIXME clean up this code! parts = name.split('.') cursor = len(parts) module_name = parts[:cursor] + ret = '' while cursor > 0: try: ret = __import__('.'.join(module_name)) break except ImportError: - if cursor == 0: - raise cursor -= 1 module_name = parts[:cursor] - ret = '' + + if ret == '': + raise ImportError(parts[0]) for part in parts[1:]: try: |