获取类的完整模块路径

2024-04-23 20:01:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我用包装器在程序中停靠Qt窗口。问题是包装器将任何窗口类作为str,然后稍后对其进行初始化,如果您在多个文件上拆分了内容,那么它就不是很pythonic了(请参阅原始编辑了解它的工作原理,但这对问题并不重要)。你知道吗

例如:

import module.submodule.MainWindow:路径是"module.submodule.MainWindow"

import module.submodule.MainWindow as MW:路径是"MW"

from module import submodule:路径是"submodule.MainWindow"

我目前的解决方法是module.MainWindow.shpw(namespace="module.MainWindow"),但我不希望被要求将其作为参数提供

我试着创建一个函数来解析globals()以找到路径,它在顶层的工作非常好。但是,我发现globals()对于每个导入都是唯一的,所以当从模板类中调用时它什么也不做。你知道吗

from types import ModuleType
import inspect
import site

site_packages_loc = site.getsitepackages()

default_modules = set([sys.modules[i] for i in set(sys.modules.keys()) & set(sys.builtin_module_names)])

def get_class_namespace(search, globals_dict=None, path=[]):
    if globals_dict is None:
        globals_dict = globals()

    #Find all objects that are modules
    modules = {}
    for k, v in globals_dict.iteritems():
        if v == search:
            return '.'.join(path + [v.__name__])
        if isinstance(v, ModuleType) and v not in default_modules:
            modules[k] = v

    #Check recursively in each module
    for k, v in modules.items():

        #Check it's not a built in module
        module_path = inspect.getsourcefile(v)
        if any(module_path.startswith(i) for i in site_packages_loc):
            continue

        module_globals = {func: getattr(v, func) for func in dir(v)}
        return_val = get_class_namespace(search, module_globals, path=path+[k])
        if return_val is not None:
            return return_val

有没有更好的方法来解决这个问题,或者我可以从导入中请求最顶层的globals()?你知道吗


Tags: pathinimport路径modulesforreturnif