我正在使用包装器将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()
?