Получить импорт, необходимый для воссоздания объекта - PullRequest
1 голос
/ 26 сентября 2019

Для объекта, созданного во время импорта кода, создайте набор импортов, необходимых для выполнения кода создания этого объекта.

Случай 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"]

Цель состоит в том, чтобы создать строки импорта, такие как предшествующие им.к объекту экземпляр кода сделает работу экземпляра.

1 Ответ

0 голосов
/ 27 сентября 2019

Это будет сделано:

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__

Случаи (1) и (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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...