diff options
Diffstat (limited to 'lib/extras/extras/__init__.py')
-rw-r--r-- | lib/extras/extras/__init__.py | 103 |
1 files changed, 0 insertions, 103 deletions
diff --git a/lib/extras/extras/__init__.py b/lib/extras/extras/__init__.py deleted file mode 100644 index 5f1662588a..0000000000 --- a/lib/extras/extras/__init__.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (c) 2010-2012 extras developers. See LICENSE for details. - -"""Extensions to the Python standard library.""" - -import sys - -__all__ = [ - 'safe_hasattr', - 'try_import', - 'try_imports', - ] - -# same format as sys.version_info: "A tuple containing the five components of -# the version number: major, minor, micro, releaselevel, and serial. All -# values except releaselevel are integers; the release level is 'alpha', -# 'beta', 'candidate', or 'final'. The version_info value corresponding to the -# Python version 2.0 is (2, 0, 0, 'final', 0)." Additionally we use a -# releaselevel of 'dev' for unreleased under-development code. -# -# If the releaselevel is 'alpha' then the major/minor/micro components are not -# established at this point, and setup.py will use a version of next-$(revno). -# If the releaselevel is 'final', then the tarball will be major.minor.micro. -# Otherwise it is major.minor.micro~$(revno). - -__version__ = (0, 0, 3, 'final', 0) - - -def try_import(name, alternative=None, error_callback=None): - """Attempt to import ``name``. If it fails, return ``alternative``. - - When supporting multiple versions of Python or optional dependencies, it - is useful to be able to try to import a module. - - :param name: The name of the object to import, e.g. ``os.path`` or - ``os.path.join``. - :param alternative: The value to return if no module can be imported. - Defaults to None. - :param error_callback: If non-None, a callable that is passed the ImportError - when the module cannot be loaded. - """ - module_segments = name.split('.') - last_error = None - while module_segments: - module_name = '.'.join(module_segments) - try: - module = __import__(module_name) - except ImportError: - last_error = sys.exc_info()[1] - module_segments.pop() - continue - else: - break - else: - if last_error is not None and error_callback is not None: - error_callback(last_error) - return alternative - nonexistent = object() - for segment in name.split('.')[1:]: - module = getattr(module, segment, nonexistent) - if module is nonexistent: - if last_error is not None and error_callback is not None: - error_callback(last_error) - return alternative - return module - - -_RAISE_EXCEPTION = object() -def try_imports(module_names, alternative=_RAISE_EXCEPTION, error_callback=None): - """Attempt to import modules. - - Tries to import the first module in ``module_names``. If it can be - imported, we return it. If not, we go on to the second module and try - that. The process continues until we run out of modules to try. If none - of the modules can be imported, either raise an exception or return the - provided ``alternative`` value. - - :param module_names: A sequence of module names to try to import. - :param alternative: The value to return if no module can be imported. - If unspecified, we raise an ImportError. - :param error_callback: If None, called with the ImportError for *each* - module that fails to load. - :raises ImportError: If none of the modules can be imported and no - alternative value was specified. - """ - module_names = list(module_names) - for module_name in module_names: - module = try_import(module_name, error_callback=error_callback) - if module: - return module - if alternative is _RAISE_EXCEPTION: - raise ImportError( - "Could not import any of: %s" % ', '.join(module_names)) - return alternative - - -def safe_hasattr(obj, attr, _marker=object()): - """Does 'obj' have an attribute 'attr'? - - Use this rather than built-in hasattr, as the built-in swallows exceptions - in some versions of Python and behaves unpredictably with respect to - properties. - """ - return getattr(obj, attr, _marker) is not _marker |