2013-04-12 3 views
5

Я пытаюсь загрузить 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

Как вы получили доступ к мату со значениями из файла yaml? Созданный массив кажется просто нулевым. – Acoop

ответ

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, возможно, было бы проще, если бы эти теги были изменены на основные теги в приложении.

Смежные вопросы