想象一下,你有类似下面的东西 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
检查绒毛:)
有什么想法吗?
基于 YAML文档,什么 yaml.load()
它的作用是将YAML文档转换为python对象。
这个函数
yaml.load()
将一个YAML文档转换为一个Python对象。yaml.load()
接受一个字节字符串,一个Unicode字符串,一个开放的二进制文件对象,或者一个开放的文本文件对象。
你得到这个错误的原因是你从yaml文件中加载了一个数据,而这个数据没有合适的对象来存储。只要你没有在python运行环境中导入库,它就和你电脑上的其他文件一样,只是一个文件,对python来说没有特定的价值。所以,解决这个问题的唯一方法就是你应该 import
适当的类定义来将你的数据存储到其中,这是你在最后一部分做的。只要导入 Thirdpartyfoo
也能完成这项工作,因为它将每个定义都加载到python运行环境中。