2011-03-30 15 views
28

मेरे पास यह है:मैं स्ट्रिंग कॉन्सटेनेशन, या वाईएएमएल में स्ट्रिंग प्रतिस्थापन कैसे कर सकता हूं?

user_dir: /home/user 
user_pics: /home/user/pics 

मैं user_pics के लिए user_dir का उपयोग कैसे कर सकता हूं? अगर मुझे इस तरह के अन्य गुणों को निर्दिष्ट करना है, तो यह बहुत शुष्क नहीं होगा।

उत्तर

28

आप एक दोहराया नोड, इस तरह उपयोग कर सकते हैं:

user_dir: &user_home /home/user 
user_pics: *user_home 

मुझे नहीं लगता कि आप हालांकि जोड़ सकते हैं, तो यह नहीं काम होगा:

user_dir: &user_home /home/user 
user_pics: *user_home/pics 
+0

इसे साफ़ करने के लिए धन्यवाद। सोचने के लिए मुझे मूर्खतापूर्ण यह संभव था। –

3

मुझे लगता है कि YAML स्वयं does not define way to do this

अच्छी खबर यह है कि वाईएएमएल उपभोक्ता चर को समझने में सक्षम हो सकता है।
आपका वाईएएमएल क्या उपयोग करेगा?

+0

मेरी yaml फ़ाइल कॉन्फ़िगरेशन फ़ाइल के रूप में कार्य करती है। जो मैंने उपरोक्त चिपकाया वह समस्या को स्पष्ट करने के लिए एक उदाहरण के रूप में था। – Geo

+0

क्या कॉन्फ़िगरेशन फ़ाइल के लिए? –

+0

@ अरनिस एल। [उदाहरण के लिए यह एक] (https://github.com/Hi-Angel/yi/blob/7dd59102a84dec6a1e52f4ddca49d5f259a76fdc/example-configs/yi-emacs-vty-static/stack.yaml) स्रोत कोड निर्देशिकाओं के पथ को परिभाषित करने के लिए एक अलग मॉड्यूल का निर्माण। –

3

मैं का प्रयोग करेंगे एक सरणी, फिर वर्तमान ओएस सेपरेटर प्रतीक

के साथ स्ट्रिंग में शामिल हों:

default: &default_path "you should not use paths in config" 
pictures: 
    - *default_path 
    - pics 
8

यदि आप PyYaml के साथ अजगर का उपयोग कर रहे हैं, तो YAML फ़ाइल में तारों में शामिल होना संभव है।

os.path.join साथ:: दुर्भाग्य से यह केवल एक अजगर समाधान, नहीं एक सार्वभौमिक एक है

user_dir: &home /home/user 
user_pics: !!python/object/apply:os.path.join [*home, pics] 
string.join साथ

(पूर्णता के लिए - इस विधि लचीलापन स्ट्रिंग में शामिल होने के कई रूपों के लिए इस्तेमाल किया जाना है:

user_dir: &home /home/user 
user_pics: !!python/object/apply:string.join [[*home, pics], /] 
+1

इस दृष्टिकोण का अर्थ स्पष्ट करें - आप पाइमल पार्सर को yaml इनपुट फ़ाइल से मनमाने ढंग से पाइथन कोड निष्पादित करने की अनुमति दे रहे हैं।यदि आप इनपुट के स्रोत को नियंत्रित नहीं करते हैं तो यह एक बेहद खतरनाक सुरक्षा समस्या है। सुरक्षा कार्यक्रम से बचने के लिए कई प्रोग्राम 'yaml.safe_load()' फ़ंक्शन का उपयोग करेंगे। उस स्थिति में, आपका कोड काम नहीं करेगा। –

+0

क्या आपके पास स्ट्रिंग में शामिल होने के लिए एक पायथन 3 उदाहरण है? 'मॉड्यूल' str 'नहीं मिला (' str 'नामक कोई मॉड्यूल नहीं) ' –

21

यह आश्चर्य की बात है, क्योंकि YAML के प्रयोजन के & संदर्भ एंकर वहाँ एक अंतर्निहित तरीका referenc का उपयोग कर तार जोड़ नहीं है कि, YAML डेटा फ़ाइलों से बाहर दोहराव कारक है तों। भागों से पथ नाम बनाने का आपका उपयोग मामला एक अच्छा उदाहरण है - ऐसे कई उपयोग होने चाहिए।

सौभाग्य से पाइथन में कस्टम टैग के माध्यम से वाईएएमएल में स्ट्रिंग कॉन्सटेनेशन जोड़ने का एक आसान तरीका है।

import yaml 

## define custom tag handler 
def join(loader, node): 
    seq = loader.construct_sequence(node) 
    return ''.join([str(i) for i in seq]) 

## register the tag handler 
yaml.add_constructor('!join', join) 

## using your sample data 
yaml.load(""" 
user_dir: &DIR /home/user 
user_pics: !join [*DIR, /pics] 
""") 

कौन सा में परिणाम:

{'user_dir': '/home/user', 'user_pics': '/home/user/pics'} 

आप " " या "-" जैसी सरणी के लिए और अधिक आइटम जोड़ सकते हैं,, तार अलग किया जाएगा यदि।

+0

धन्यवाद, यह मेरे लिए काम करता है! – Chris

+2

एर ... तो, इसे वाईएएमएल, पायथन, हास्केल, या जो भी कुछ से स्वतंत्र मार्कअप भाषा के साथ क्या करना है? –

+0

वाईएएमएल स्पेक कहता है: "विस्मयादिबोधक बिंदु ("! ") का उपयोग करके एक टैग के साथ स्पष्ट टाइपिंग को इंगित किया गया है ... एप्लिकेशन-विशिष्ट स्थानीय टैग का भी उपयोग किया जा सकता है।" मैंने एक स्पष्ट प्रकार का कार्यान्वयन प्रदान किया जो spec को पूरा करता है। कार्यान्वयन कुछ भाषा में होना चाहिए। मैंने पायथन का इस्तेमाल किया क्योंकि ओपी ने कहा कि वह अपने वाईएएमएल के लिए एक और "डीआरवाई" दृष्टिकोण चाहता था, और डीआरवाई एक शब्द है जिसे अक्सर पाइथन लोगों द्वारा उपयोग किया जाता है। एक ही कस्टम टैग अन्य भाषाओं में लागू किया जा सकता है। दूसरे शब्दों में, ओपी से पूछा गया है कि वेनिला वाईएएमएल में उपलब्ध नहीं है, लेकिन वाईएएमएल द्वारा परिभाषित एक विस्तार तंत्र के माध्यम से उपलब्ध है। –

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