我正在尝试加载看起来像这样的YAML:
dist: !!opencv-matrix
rows: 380
cols: 380
dt: f
data: [ 0., 0., -1.88644529e+18, 2.45423365e+00, 11698176.,
2.03862047e+00, -8.85501460e+10, 2.54738545e+00, 1.71208843e+20,
...
2.44447327e+00 ]
加载代码只是:
import yaml
y = yaml.load(s)
其中s是加载到字符串中的YAML。
我收到此错误:
yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:opencv-matrix'
in "<string>", line 382, column 7:
dist: !!opencv-matrix
这很公平,所以我添加了该标记的构造函数:
def opencv_matrix(loader, node):
mapping = loader.construct_mapping(node)
mat = np.array(mapping["data"])
mat.resize(mapping["rows"], mapping["cols"])
return mat
yaml.add_constructor(u"!!opencv-matrix", opencv_matrix)
y = yaml.load(s)
我仍然得到错误。但是,如果我用!opencv_matrix替换!! opencv_matrix,那么一切正常。
这里发生了什么?
答案 0 :(得分:4)
!!opencv-matrix
等辅助代码实际上是tag:yaml.org,2002:opencv-matrix
的简写(reference card中提到)。看起来PyYAML的add_constructor
方法无法正确处理这种速记符号。
这可能是一个错误,具体取决于二级标记的解释方式(参见下面的第二部分)。我已经提交了错误报告here,希望能够得到解决。
!opencv-matrix
等主要标签是明确定义的,加载似乎在PyYAML中没有任何问题。
如果您在!!opencv-matrix
来电中将tag:yaml.org,2002:opencv-matrix
替换为add_constructor
,那么它适用于我。
对于原始问题,AFAIK主要代码(!
)用于用户定义的类型,而辅助代码(!!
)用于表示与标准语言无关的类型defined here (因此长而华丽的格式)。
如果这是OpenCV生成的文件,那么如果将这些标记更改为应用程序中的主标记,则可能会更简单。