Pythonic获取`package.module.Class`的方法

时间:2011-09-15 22:03:08

标签: python string import module

给定一个字符串形式为'package.module.Class',Python中是否有任何简单的方法可以直接获取类对象(假设模块尚未导入)?

如果没有,那么将'package.module'部分与'Class'部分__import__()模块分开,然后从中获取类的最简洁方法是什么?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

尝试这样的事情:

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'的任何内容,例如模块级函数,常量等。