Pythonic способ получить `package.module.Class` - PullRequest
4 голосов
/ 16 сентября 2011

Учитывая строку в форме 'package.module.Class', есть ли в Python простой способ получить объект класса напрямую (при условии, что модуль еще не импортирован)?

Если нет, то какой самый чистыйспособ отделить 'package.module' часть от 'Class' часть, __import__() модуля, а затем получить класс из этого?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Попробуйте что-то вроде этого:

def import_obj(path):
    path_parts = path.split(".")
    obj = __import__(".".join(path_parts[:-1]))
    path_remainder = list(reversed(path_parts[1:]))
    while path_remainder:
        obj = getattr(obj, path_remainder.pop())
    return obj

Это будет работать для всего, что может быть getattr 'от модуля, например функции уровня модуля, константы и пр.

3 голосов
/ 16 сентября 2011
import sys
def str_to_obj(astr):
    '''
    str_to_obj('scipy.stats.stats') returns the associated module
    str_to_obj('scipy.stats.stats.chisquare') returns the associated function
    '''
    # print('processing %s'%astr)
    try:
        return globals()[astr]
    except KeyError:
        try:
            __import__(astr)
            mod=sys.modules[astr]
            return mod
        except ImportError:
            module,_,basename=astr.rpartition('.')
            if module:
                mod=str_to_obj(module)
                return getattr(mod,basename)
            else:
                raise
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...