如何识别第三个paty yaml转储对象,而不需要指定多余的导入状态。

问题描述 投票:0回答:1

想象一下,你有类似下面的东西 yaml:

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

此外,假设您已经安装了软件包 Thirdpartyfoo 使用一些pip install之类的东西。

现在你想把yaml中的东西弄回python obeject中,所以你就这么做了。

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 检查绒毛:)

有什么想法吗?

python-3.x pyyaml flake8
1个回答
0
投票

基于 YAML文档,什么 yaml.load() 它的作用是将YAML文档转换为python对象。

这个函数 yaml.load() 将一个YAML文档转换为一个Python对象。yaml.load() 接受一个字节字符串,一个Unicode字符串,一个开放的二进制文件对象,或者一个开放的文本文件对象。

你得到这个错误的原因是你从yaml文件中加载了一个数据,而这个数据没有合适的对象来存储。只要你没有在python运行环境中导入库,它就和你电脑上的其他文件一样,只是一个文件,对python来说没有特定的价值。所以,解决这个问题的唯一方法就是你应该 import 适当的类定义来将你的数据存储到其中,这是你在最后一部分做的。只要导入 Thirdpartyfoo 也能完成这项工作,因为它将每个定义都加载到python运行环境中。

© www.soinside.com 2019 - 2024. All rights reserved.