获取重新创建obj所需的导入

2024-04-19 23:32:09 发布

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

给定在导入代码期间生成的对象,生成执行该对象创建代码所需的导入集

案例1:

some_obj = module.submodule.Class(42)
get_imports for_object(some_obj)
>>> "import module.submodule"

情况2(有时根模块不会自动导入子模块(例如,气流操作符)):

some_obj = submodule.Class(42)
get_imports for_object(some_obj)
>>> "from module import submodule"

案例3(伸展目标):

some_obj = submodule.Class(sub2.Class2(42))
get_imports for_object(some_obj)
>>> ["from module import submodule", "from module2 import sub2"]

目标是生成导入行,以便将它们预先添加到对象实例化代码将使实例化工作


Tags: 模块对象代码fromimportobjforget
1条回答
网友
1楼 · 发布于 2024-04-19 23:32:09

这样就可以了:

def get_object_imports(obj, sub_obj_class_name=None):
    sub_obj_modules = []
    if sub_obj_class_name is not None:
        for _, attribute_value in obj.__dict__.items():
            value_str = str(getattr(attribute_value,'__class__',''))
            if ('.' + sub_obj_class_name) in value_str:
                sub_obj_modules.append(attribute_value.__module__)

    if sub_obj_modules != []:
        sub_module_imports = [('import ' + sub_obj_module) for sub_obj_module
                              in sub_obj_modules]
        return ['import ' + obj.__module__] + sub_module_imports
    else:
        return 'import ' + obj.__module__

个案(一)及(2) 是等效的,因为运行或导入相同的模块。请注意,在上述情况下,将包括具有相同类名但不同模块源的对象。


演示
from module import class1
from other_module import submodule

obj1 = class1()
obj2 = obj1(submodule.class2())

print(get_object_imports(obj2, 'class2'))
# ['import module', 'import other_module.submodule']

相关问题 更多 >