Source code for schrodinger.utils.moduleproxy
"""
A module proxy class to be used when a non-essential module can't be
imported. It will raise an ImportError any time something from the module is
accessed.
"""
# Copyright Schrodinger, LLC.
[docs]def try_import(name):
    """
    Return the module named or a proxy that will raise an ImportError the
    first time any of its attributes are accessed.
    This allows for a non-essential module to be imported and mostly ignored
    if not present.
    """
    try:
        mod = __import__(name)
        components = name.split('.')
        for comp in components[1:]:
            mod = getattr(mod, comp)
        return mod
    except ImportError:
        return ModuleProxy(name) 
[docs]class ModuleProxy:
    """
    A class to use as a placeholder for a non-essential module, raising an
    exception when something tries to use it.
    """
[docs]    def __init__(self, name):
        self.name = name 
    def __getattr__(self, attr):
        """
        Simply raise an exception any time something tries to make use of
        functionality from the fake module.
        """
        raise ImportError("The '%s' module is not available on this platform." %
                          self.name)
    def __bool__(self):
        """
        Always return False, indicating that the instance is not usable as a
        module.
        This allows for conditional behavior to be set up, based on a check
        for a proxy module. For example:
            matplotlib = try_import("matplotlib")
            if matplotlib:
                create_pretty_graph()
            else:
                print_boring_numbers()
        """
        return False