Как распознать третий объект дампа yaml paty назад - без указания избыточных состояний импорта импорта - PullRequest
0 голосов
/ 22 апреля 2020

Представьте, что у вас есть что-то похожее на следующее yaml:

model: !!python/object:Thirdpartyfoo.foo_module.foo_class
     some_attribue: value

Кроме того, предположим, что вы уже установили пакет Thirdpartyfoo с использованием какой-либо установки pip или чего-то еще.

Теперь вы хотите вернуть вещи из yaml обратно в python объект, так что вы делаете:

import yaml
with open('foo.yaml') as f:
    dict = yaml.load(f,  yaml.Loader)

Но после запуска вы получаете сообщение об ошибке:

Except ImportError as exc:
                raise ConstructorError("while constructing a Python object", mark,
                        "cannot find module %r (%s)" % (module_name, exc), mark)
        if module_name not in sys.modules:
            raise ConstructorError("while constructing a Python object", mark,
                   "module %r is not imported" % module_name, mark)
            yaml.constructor.ConstructorError: while constructing a Python object
            module 'Thirdpartyfoo.foo_module' is not imported

В результате вы получите очень уродливое решение для этого:

import Thirdpartyfoo.foo_module.foo_class as dummy_import

with open('foo.yaml') as f:
    dict = yaml.load(f,  yaml.Loader)

Обратите внимание, что если я не буду явно упоминать строку dummy_import, я получу неиспользованный импорт в строке ... на flake8 проверка ворса :)

Есть идеи?

1 Ответ

0 голосов
/ 22 апреля 2020

Исходя из документации YAML , yaml.load() делает то, что он преобразует документы YAML в python объекты.

Функция yaml.load() преобразует документ YAML к Python объекту. yaml.load() принимает байтовую строку, строку Unicode, объект открытого двоичного файла или объект открытого текстового файла.

Причиной возникновения этой ошибки является то, что вы загружаете данные из файла yaml, в котором нет нужного объекта для хранения. Пока вы не импортируете библиотеку в среде выполнения python, это просто файл, как и любой другой файл на вашем компьютере, и для него не указано значение c python. Поэтому единственный способ решить эту проблему - это import правильное определение класса для хранения в нем ваших данных, что вы только что сделали в последней части. Простой импорт Thirdpartyfoo также будет выполнять эту работу, поскольку он загружает каждое определение в среду выполнения python.

...