2012-11-08 15 views
7

सबसे पहले, एक अस्वीकरण: मैं वाईएएमएल से बहुत परिचित नहीं हूं। मैं कुंजी मान जोड़े में एक YAML दस्तावेज़ पार्स करने के लिए कोशिश कर रहा हूँ (। मैं इसे कैसे कर रहा हूँ के बारे में चिंता मत करो मैं उस बिट संभाला मिल गया है)pyYAML त्रुटियों पर "!" एक स्ट्रिंग

मेरे फ़ाइल की तरह कुछ देखने के लिए प्रयोग किया है:

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

फिर, कोई चला गया और इसे बदल दिया।

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

क्या यह भी मतलब है:

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

और मैं इस पार्स त्रुटि मिल सकता है? मैं इसे समझने के बारे में कैसे जाउंगा! $ केवल दो अक्षर के रूप में? मैं स्ट्रिंग कुंजी और मानों का एक शब्दकोश चाहता हूं! इसके अलावा, yaml फ़ाइलों को संपादित करना एक विकल्प नहीं है। पार्सर का उपयोग कर कोड में समस्या तय की जानी चाहिए।

+0

तो हाँ, मुझे अब एहसास हुआ है कि! इसे $ uzy बनाने के लिए कहता है, फिर भी, फ़ाइल की सामग्री मेरी चिंता नहीं है। एक सुंदर फैशन में इसे संभालना है। मैं इसे क्या करना चाहता हूं इलाज के रूप में $ uzy है। – Rokujolady

+0

... भी, मददगार नहीं। – Rokujolady

उत्तर

8

विस्मयादिबोधक चिह्न वाईएएमएल टैग के लिए एक उपसर्ग है। पार्सर को टैग नाम से इसके लिए एक कन्स्ट्रक्टर लागू करना होगा। !!bool, !!int, आदि जैसे कुछ डिफ़ॉल्ट टैग हैं और यहां तक ​​कि कुछ पायथन विशिष्ट टैग जैसे !!python/tuple

आप उपसर्ग द्वारा पकड़े गए कई टैग के लिए अपने स्वयं के कन्स्ट्रक्टर और यहां तक ​​कि निर्माता भी परिभाषित कर सकते हैं। '' पर उपसर्ग को परिभाषित करके, आप सभी टैग पकड़ सकते हैं और उन्हें अनदेखा कर सकते हैं। आप टेक्स्ट और उसके मूल्य को कन्स्ट्रक्टर से वापस कर सकते हैं ताकि यह सब कुछ टेक्स्ट के रूप में व्यवहार कर सके।

>>> 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

क्या आप एक और विवरण प्रदान कर सकते हैं उदाहरण के लिए, एक समान समस्या है [यहां] (http://stackoverflow.com/questions/43081483/write-a-constructor-to-handle-specific-tags-in-ruamel-or- pyyaml) – askb

4

यदि कोई मान "!" से शुरू होता है, तो आपको मूल्य को एकल या दोहरे उद्धरणों में संलग्न करना होगा; अन्यथा इसे एक वाईएएमएल टैग के रूप में व्याख्या किया जाता है।

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

यह वास्तव में PyYAML में एक बग है। यह : को name:!$uzy में एक कुंजी/मान विभाजक के रूप में व्याख्या करता है, लेकिन ऐसा केवल तब करना चाहिए जब : किसी स्थान के बाद होता है, या यदि पिछले स्केलर (name) उद्धृत किया गया है। अनुवर्ती त्रुटि यह है कि विस्मयादिबोधक चिह्न, जिसे स्केलर के बीच में अनुमति दी जानी चाहिए, को स्केलर की शुरुआत में गलत तरीके से व्याख्या किया जाता है और इसलिए एक टैग पेश किया जाता है।

कुंजी people के लिए मूल्य स्ट्रिंग name:!$uzy address:chez-bob है और वह सही ढंग से (अजगर पैकेज जिनमें से ruamel.yaml मैं लेखक हूँ सहित) अन्य पारसर्स में नियंत्रित किया जाता है।

+0

ऐसा लगता है कि यह 2017 की शुरुआत में पीवाईएएमएमएल के स्रोतों में विलय कर दिया गया है। लेकिन आखिरी रिलीज अगस्त 2016 थी और मार्च 2014 से पहले, इसमें कुछ महीनों/साल लग सकते हैं इससे पहले कि यह उपलब्ध हो PyPI। – Anthon

संबंधित मुद्दे