web-dev-qa-db-fra.com

Importer la classe du module dynamiquement

J'ai une classe appelée 'my_class' placé dans 'my_module'. Et je dois importer cette classe. J'ai essayé de le faire comme ceci:

import importlib
result = importlib.import_module('my_module.my_class')

mais ça dit:

ImportError: No module named 'my_module.my_class'; 'my_module' is not a package

Alors. Comme je peux le voir, cela ne fonctionne que pour les modules, mais ne peut pas gérer les classes. Comment importer une classe à partir d'un module?

20
GhostKU

Il attend my_module pour être un package contenant un module nommé 'my_class'. Si vous devez importer une classe, ou un attribut en général, dynamiquement, utilisez simplement getattr après avoir importé le module:

cls = getattr(import_module('my_module'), 'my_class')

De plus, oui, cela ne fonctionne qu'avec des modules. Rappelles toi importlib.import_module est un wrapper de l'interne importlib.__import__ fonction. Elle n'offre pas la même quantité de fonctionnalités que l'instruction complète import qui, couplée à from, effectue une recherche d'attribut sur le module importé.

import importlib
import logging

logger = logging.getLogger(__name__)


def factory(module_class_string, super_cls: type = None, **kwargs):
    """
    :param module_class_string: full name of the class to create an object of
    :param super_cls: expected super class for validity, None if bypass
    :param kwargs: parameters to pass
    :return:
    """
    module_name, class_name = module_class_string.rsplit(".", 1)
    module = importlib.import_module(module_name)
    assert hasattr(module, class_name), "class {} is not in {}".format(class_name, module_name)
    logger.debug('reading class {} from module {}'.format(class_name, module_name))
    cls = getattr(module, class_name)
    if super_cls is not None:
        assert issubclass(cls, super_cls), "class {} should inherit from {}".format(class_name, super_cls.__name__)
    logger.debug('initialising {} with params {}'.format(class_name, kwargs))
    obj = cls(**kwargs)
    return obj
1
Hanan Shteingart