আপনার উদাহরণটি অবৈধ তা কেবল কারণ আপনি আপনার স্কেলারগুলি শুরু করার জন্য কোনও সংরক্ষিত চরিত্র বেছে নিয়েছিলেন। যদি আপনি *
কিছু অন্যান্য অন-সংরক্ষিত চরিত্রের সাথে প্রতিস্থাপন করেন (এর জন্য আমি অ-এসসিআইআই অক্ষরগুলি ব্যবহার করার প্রবণতা খুব কমই কিছু স্পেসিফিকেশনের অংশ হিসাবে ব্যবহৃত হয়), আপনি পুরোপুরি আইনী ওয়াইএএমএল দিয়ে শেষ করবেন:
paths:
root: /path/to/root/
patha: ♦root♦ + a
pathb: ♦root♦ + b
pathc: ♦root♦ + c
এটি আপনার পার্সার যে ভাষায় ম্যাপিংগুলি ব্যবহার করে এবং যাদুকরীভাবে কোনও কিছুর প্রসারিত করে না তার জন্য মানক উপস্থাপনায় এটি লোড হবে।
এটি করার জন্য নিম্নলিখিত পাইথন প্রোগ্রামের মতো স্থানীয়ভাবে ডিফল্ট অবজেক্ট টাইপ ব্যবহার করুন:
# coding: utf-8
from __future__ import print_function
import ruamel.yaml as yaml
class Paths:
def __init__(self):
self.d = {}
def __repr__(self):
return repr(self.d).replace('ordereddict', 'Paths')
@staticmethod
def __yaml_in__(loader, data):
result = Paths()
loader.construct_mapping(data, result.d)
return result
@staticmethod
def __yaml_out__(dumper, self):
return dumper.represent_mapping('!Paths', self.d)
def __getitem__(self, key):
res = self.d[key]
return self.expand(res)
def expand(self, res):
try:
before, rest = res.split(u'♦', 1)
kw, rest = rest.split(u'♦ +', 1)
rest = rest.lstrip() # strip any spaces after "+"
# the lookup will throw the correct keyerror if kw is not found
# recursive call expand() on the tail if there are multiple
# parts to replace
return before + self.d[kw] + self.expand(rest)
except ValueError:
return res
yaml_str = """\
paths: !Paths
root: /path/to/root/
patha: ♦root♦ + a
pathb: ♦root♦ + b
pathc: ♦root♦ + c
"""
loader = yaml.RoundTripLoader
loader.add_constructor('!Paths', Paths.__yaml_in__)
paths = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)['paths']
for k in ['root', 'pathc']:
print(u'{} -> {}'.format(k, paths[k]))
যা মুদ্রণ করবে:
root -> /path/to/root/
pathc -> /path/to/root/c
প্রসারণটি উড়ে গিয়ে সম্পন্ন হয় এবং নেস্টেড সংজ্ঞাগুলি পরিচালনা করে তবে আপনাকে অসীম পুনরাবৃত্তি না করার বিষয়ে সতর্ক থাকতে হবে।
ডাম্পারটি নির্দিষ্ট করে, অন-ফ্লাই সম্প্রসারণের কারণে, আপনি লোড হওয়া ডেটা থেকে আসল ওয়াইএএমএলটি ডাম্প করতে পারেন:
dumper = yaml.RoundTripDumper
dumper.add_representer(Paths, Paths.__yaml_out__)
print(yaml.dump(paths, Dumper=dumper, allow_unicode=True))
এটি ম্যাপিং কী ক্রমটি পরিবর্তন করবে। যদি এটি একটি সমস্যা আপনি করতে হবে self.d
একটি CommentedMap
(থেকে আমদানি করা ruamel.yaml.comments.py
)