有什么区别!和!! 在yaml?

mpe*_*kov 5 python opencv yaml

我正在尝试加载看起来像这样的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 ]
Run Code Online (Sandbox Code Playgroud)

加载代码只是:

import yaml
y = yaml.load(s)
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

这很公平,所以我添加了该标记的构造函数:

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)
Run Code Online (Sandbox Code Playgroud)

我仍然得到错误.但是,如果我用!opencv_matrix替换!! opencv_matrix,那么一切正常.

这里发生了什么?

mar*_*ard 5

二级标签!!opencv-matrix实际上是tag:yaml.org,2002:opencv-matrix(在参考卡中提到的)的简写。看起来 PyYAML 的add_constructor方法没有正确处理这个速记符号。

这可能是一个错误,具体取决于二级标签的解释方式(请参阅下面的第二部分)。我在这里提交了一个错误报告,希望它会得到解决。

像这样的主要标签!opencv-matrix是明确定义的,在 PyYAML 中加载似乎没有任何问题。

如果您在通话中替换!!opencv-matrixtag:yaml.org,2002:opencv-matrix,它对我add_constructor有用。


至于原始问题,AFAIK 主要标签 ( !) 用于用户定义的类型,而次要标签 ( !!) 用于表示此处定义的与语言无关的标准类型(因此是长而奇特的格式)。

如果这是一个 OpenCV 生成的文件,那么如果将这些标签更改为应用程序中的主要标签可能会更简单。