2012-11-08 18 views
7

İlk olarak, bir feragatname: YAML ile çok aşina değilim. Key Değeri Çiftler içine YAML doc ayrıştırmak çalışıyorum (. Ben yapıyorum nasıl dert etmeyin ben ele orasını var)pyYAML "!" Ile ilgili Hatalar Bir dize

Dosyam gibi görünmelidir derdi:

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

Sonra, birisi gitti ve değiştirdi.

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

bu da ne demek:

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

Ve bu ayrıştırma hatası olsun? Sadece iki karakter olarak yorumlamak için nasıl alacağım? Sadece dize anahtarları ve değerleri sözlüğü istiyorum! Ayrıca, yaml dosyalarını düzenlemek bir seçenek değildir. Sorun, ayrıştırıcıyı kullanarak kodda düzeltilmelidir.

+0

Evet, şimdi bunun farkındayım! ona bir uzy yapmasını söyler, yine de dosyanın içeriği benim kaygım değil. Zarif bir şekilde ele almaktır. Yapmak istediğim şey, metin olarak! Uzy! – Rokujolady

+0

... Ayrıca, YARARLI DEĞİL. – Rokujolady

cevap

8

ünlem işareti YAML etiketleri için bir önek olduğunu. Ayrıştırıcı, etiket adıyla bunun için bir kurucu uygulamak zorundadır. !!bool, !!int, vb !!python/tuple gibi hatta bazı Python belirli etiketler gibi bazı varsayılan etiketi yok.

Bir önek tarafından yakalanan birden fazla etiket için kendi kurucularınızı ve hatta kurucularınızı tanımlayabilirsiniz. Ön ekini '' olarak tanımlayarak, tüm etiketleri yakalayabilir ve yoksayabilirsiniz. Etiketi ve değerini tüm yapıcı olarak ele almak için kurgudan döndürebilirsiniz.

>>> import yaml 
>>> def default_ctor(loader, tag_suffix, node): 
...  print loader 
...  print tag_suffix 
...  print node 
...  return tag_suffix + ' ' + node.value 
... 
>>> yaml.add_multi_constructor('', default_ctor) 
>>> yaml.load(y) 
<yaml.loader.Loader object at 0xb76ce8ec> 
!$uzy 
ScalarNode(tag=u'!$uzy', value=u'') 
{'world': {'people': {'name': '!$uzy', 'address': 'chez-bob'}}} 
>>> 
+0

Lütfen daha fazla ayrıntı örneği verebilir misiniz, benzer bir sorun var [burada] (http://stackoverflow.com/questions/43081483/write-a-constructor-to-handle-specific-tags-in-ruamel-or- pyyaml) – askb

4

Bir değer "!" Ile başlıyorsa, değeri tek veya çift tırnak içine almanız gerekir; aksi takdirde YAML etiketi olarak yorumlanır.

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

Bu aslında PyYAML'deki bir hatadır. 'u name:!$uzy'da anahtar/değer ayırıcı olarak yorumlar, ancak yalnızca : izlerse veya önceki skaler (name) belirtilmişse bunu yapmalıdır. Takip hatası, bir skalerın ortasında izin verilmesi gereken ünlem işaretinin, bir skalerin başlangıcında olduğu gibi yanlış yorumlandığı ve dolayısıyla bir etiket oluşturduğu yönündedir.

anahtar people değeri dize name:!$uzy address:chez-bob olduğunu ve doğru bir şekilde (Ben yazarım ruamel.yaml hangi Python paketinde dahil) diğer ayrıştırıcıları içinde ele alınır.

+0

Bu, 2017 yılının başında PyYAML için kaynaklarda birleştirilen bir düzeltmeye benziyor. Ancak, son sürüm Ağustos 2016'dan ve Mart 2014'ten önceki sürümden bu yana, birkaç ay/yıl sürebilir. PyPI. – Anthon

İlgili konular