2013-04-12 25 views
5

Próbuję załadować YAML, który wygląda tak:Jaka jest różnica między! i !! w 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 ] 

Kod ładowania jest tylko:

import yaml 
y = yaml.load(s) 

gdzie s jest YAML załadowany na sznurku.

otrzymuję ten błąd:

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 

to wystarczy fair, więc dodam konstruktora dla tego tagu:

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) 

nadal pojawia się błąd. Jednakże jeśli zamieniam !! opencv_matrix na! Opencv_matrix, wszystko działa.

Co tu się dzieje?

+0

W jaki sposób uzyskałeś dostęp do macie z wartościami z pliku yaml? Utworzona tablica wydaje się być tylko zerami. – Acoop

Odpowiedz

4

Dodatkowe znaczniki, takie jak !!opencv-matrix, są w istocie skrótem dla tag:yaml.org,2002:opencv-matrix (wymienione w reference card). Wygląda na to, że metoda PyYAML o numerze add_constructor nie obsługuje poprawnie tej notacji skróconej.

Może to być błąd, w zależności od interpretacji znaczników pomocniczych (patrz druga część poniżej). Zgłosiłem zgłoszenie błędu here i mam nadzieję, że zostanie ono zaadresowane.

Pierwotne znaczniki, takie jak !opencv-matrix, są zdefiniowane jawnie, a ładowanie wydaje się działać bez problemów w PyYAML.

Działa to dla mnie, jeśli zastąpisz !!opencv-matrix przez tag:yaml.org,2002:opencv-matrix w wywołaniu add_constructor.


chodzi o oryginalne pytanie, AFAIK podstawowe znaczniki (!) są dla typów zdefiniowanych przez użytkownika, natomiast znaczniki wtórne (!!) mają reprezentować standardowe typy niezależny od języka defined here (stąd długie i fantazyjne format) .

Jeśli jest to plik wygenerowany przez OpenCV, być może prawdopodobnie byłoby prostsze, gdyby zmieniono te znaczniki na znaczniki podstawowe w aplikacji.

Powiązane problemy