2012-11-08 10 views
7

Po pierwsze, zrzeczenie się: Nie jestem zbyt zaznajomiony z YAML. Próbuję analizować doc YAML do par klucz wartość (. Nie martw się, jak to robię, że mam trochę obsługiwane)pyYAML Błędy na "!" w ciągu znaków

Mój plik używany do wyglądać następująco:

world: 
    people: 
      name:Suzy 
      address:chez-bob 

Potem ktoś poszedł i zmienił to.

world: 
    people: 
      name:!$uzy 
      address:chez-bob 

I ten błąd składniowy:

yaml.constructor.ConstructorError: could not determine a constructor for the tag '!$uzy' 

Co to w ogóle znaczy? W jaki sposób chciałbym uzyskać to tylko interpretować! $ Jako tylko dwie postacie? Po prostu chcę słownika kluczy i wartości ciągu! Edycja plików yaml również nie jest opcją. Problem musi zostać naprawiony w kodzie za pomocą analizatora składni.

+0

Tak, teraz rozumiem, że! mówi, żeby zbudować $ U, niemniej zawartość pliku nie jest moją obawą. Poradzenie sobie z nim w zgrabny sposób jest. Chcę tylko, żeby traktować! $ Uzy jako tekst. – Rokujolady

+0

... również, NIE POMOCNE. – Rokujolady

Odpowiedz

8

Wykrzyknik to przedrostek znaczników YAML. Analizator składni musi zaimplementować do niego konstruktora według nazwy znacznika. Istnieją pewne domyślne tagi, takie jak !!bool, !!int itd., A nawet niektóre znaczniki w języku Python, takie jak !!python/tuple.

Można zdefiniować własne konstruktory, a nawet konstruktory dla wielu znaczników przechwyconych przez prefiks. Definiując przedrostek do '', można przechwytywać wszystkie znaczniki i zignorować je. Możesz zwrócić znacznik i jego wartość z konstruktora, aby traktować go jako tekst.

+0

Czy możesz podać bardziej szczegółowy przykład, mieć podobny problem [tutaj] (http://stackoverflow.com/questions/43081483/write-a-constructor-to-handle-specific-tags-in-ruamel-or- pyyaml) – askb

4

Jeśli wartość zaczyna się od "!", Należy ująć wartość w pojedyncze lub podwójne cudzysłowy; w przeciwnym razie jest interpretowany jako znacznik YAML.

world: 
    people: 
      name: "!$uzy" 
      address: chez-bob 
0

To jest właściwie błąd w PyYAML. Interpretuje on : w name:!$uzy jako separator klucz/wartość, ale powinien to robić, jeśli po : następuje spacja, lub jeśli poprzedni skalar (name) jest cytowany. Błąd kontrolny polega na tym, że wykrzyknik, który powinien być dozwolony w środku skalaru, zostaje nieprawidłowo zinterpretowany jako będący na początku skalaru, a zatem wprowadzający tag.

Wartość klucza people to ciąg name:!$uzy address:chez-bob, który jest obsługiwany poprawnie w innych analizatorach składni (w tym w pakiecie Python ruamel.yaml, którego jestem autorem).

+0

Wygląda na to, że poprawka do tego została włączona do źródeł PyYAML na początku 2017 roku. Ale ponieważ ostatnie wydanie miało miejsce w sierpniu 2016 r., a drugie przed marcem 2014 r., może upłynąć kilka miesięcy/lat, zanim będzie dostępne na stronie PyPI. – Anthon