এটি কাজ করে না:
মার্জ শুধুমাত্র ম্যাপিংয়ের জন্য ওয়াইএএমএল স্পেসিফিকেশন দ্বারা সমর্থিত এবং ক্রমগুলির জন্য নয় merge
আপনি <<
কী / মান বিভাজক :
এবং একটি মান যা একটি রেফারেন্স এবং তারপরে একই ইন্ডেন্টেশন পর্যায়ে একটি তালিকা দিয়ে চালিয়ে যাওয়ার পরে একটি মার্জ কী থাকার মাধ্যমে আপনি জিনিসগুলি সম্পূর্ণরূপে মিশ্রিত করছেন
এটি YAML সঠিক নয়:
combine_stuff:
x: 1
- a
- b
সুতরাং আপনার উদাহরণ বাক্য গঠনটি ওয়াইএএমএল এক্সটেনশন প্রস্তাব হিসাবেও বোঝায় না।
আপনি যদি একাধিক অ্যারে মার্জ করার মতো কিছু করতে চান তবে আপনি একটি বাক্য গঠন যেমন বিবেচনা করতে পারেন:
combined_stuff:
- <<: *s1, *s2
- <<: *s3
- d
- e
- f
যেখানে s1
, s2
, s3
সিকোয়েন্স (দেখানো হয়নি) যে আপনি একটি নতুন ক্রম মধ্যে একত্রীকরণ করতে চান এবং তারপর উপর নোঙ্গর হয় d
, e
এবং f
যে যোগ করা। তবে ওয়াইএএমএল প্রথমে এই ধরণের কাঠামোর গভীরতার সমাধান করছে, সুতরাং মার্জ কীটি প্রক্রিয়াকরণের সময় কোনও বাস্তব প্রসঙ্গ পাওয়া যায় না। আপনার কাছে এমন কোনও অ্যারে / তালিকা উপলব্ধ নেই যেখানে আপনি প্রক্রিয়াজাত মানটি (অ্যাঙ্কার্ড সিকোয়েন্স) সংযুক্ত করতে পারেন।
আপনি @ ড্রেফটিম্যাকের প্রস্তাবিত মতামতটি নিতে পারেন, তবে এটির বিশাল অসুবিধা রয়েছে যা আপনার কোনওভাবে জানা উচিত যে কোন নেস্টেড ক্রমগুলি ফ্ল্যাট করতে হবে (অর্থাত বোঝা ডেটা কাঠামোর মূল থেকে প্যারেন্ট সিকোয়েন্স পর্যন্ত "পথ" জেনে), বা আপনি যে পুনরাবৃত্তভাবে নেস্টেড অ্যারে / তালিকাগুলি অনুসন্ধান করে ভারী ডেটা স্ট্রাকচারটি হাঁটেন এবং নির্বিচারে তাদের সকলকে সমতল করুন।
আইএমও এর চেয়ে আরও ভাল সমাধান হ'ল ডেটা স্ট্রাকচার লোড করতে ট্যাগ ব্যবহার করা যা আপনার জন্য চাটুকার্য করে। এটি কী সমতল করতে হবে এবং কোনটি নয় এবং কীভাবে এই ফ্ল্যাটিং লোডিংয়ের সময় করা হয়, বা অ্যাক্সেসের সময় করা হয়েছিল তা পুরো নিয়ন্ত্রণ দেয় তা স্পষ্টভাবে বোঝানোর অনুমতি দেয়। কোনটি চয়ন করা তা সময় এবং স্টোরেজ স্পেসে প্রয়োগকরণ এবং দক্ষতার স্বাচ্ছন্দ্যের বিষয়। এটি একই বাণিজ্য বন্ধ যা মার্জ কী বৈশিষ্ট্যটি বাস্তবায়নের জন্য করা দরকার এবং এর কোনও একক সমাধান নেই যা সর্বদা সেরা।
উদাহরণস্বরূপ, আমার ruamel.yaml
লাইব্রেরিটি নিরাপদ-লোডার ব্যবহারের সময় লোডের সময় ব্রুট ফোর্স মার্জ-ডিক্টস ব্যবহার করে, যার ফলে মার্জড ডিকশনারিগুলি পাওয়া যায় যা পাইথন ডিক্টস are এই মার্জিংটি আপ-ফ্রন্ট করতে হবে এবং ডুপ্লিকেটস ডেটা (স্পেস অদক্ষ) তবে মান সন্ধানে দ্রুত। রাউন্ড-ট্রিপ-লোডার ব্যবহার করার সময়, আপনি মার্জগুলি নিমজ্জিত করে ফেলতে সক্ষম করতে চান, তাই তাদের আলাদা রাখা দরকার। রাউন্ড-ট্রিপ-লোডিংয়ের ফলে লোড হওয়া ডেটাস্ট্রাক্টের মতো ডিকটি স্থান দক্ষ কিন্তু অ্যাক্সেসের চেয়ে ধীর, কারণ এটি ডিলের মধ্যে মার্জগুলিতে পাওয়া যায় না এমন কীটি অনুসন্ধান করার চেষ্টা করতে হবে (এবং এটি ক্যাশেড নয়, তাই এটি প্রতিবার করা দরকার)। অপেক্ষাকৃত ছোট কনফিগারেশন ফাইলগুলির জন্য এই জাতীয় বিবেচনাগুলি খুব গুরুত্বপূর্ণ নয়।
নিম্নলিখিতটি পাইথন সহ অবজেক্টগুলিতে তালিকার জন্য সংযুক্তির মতো প্রকল্পের জন্য একীকরণের মতো প্রকল্প প্রয়োগ করে flatten
যা অন-দ্য ফ্লাইটি তালিকা এবং ট্যাগযুক্ত আইটেমগুলিতে পুনরাবৃত্তি করে toflatten
। এই দুটি ট্যাগ ব্যবহার করে আপনার ওয়াইএএমএল ফাইল থাকতে পারে:
l1: &x1 !toflatten
- 1
- 2
l2: &x2
- 3
- 4
m1: !flatten
- *x1
- *x2
- [5, 6]
- !toflatten [7, 8]
(ফ্লো বনাম ব্লক স্টাইল সিকোয়েন্সগুলির ব্যবহার সম্পূর্ণ স্বেচ্ছাসেবী এবং লোড হওয়া ফলাফলের কোনও প্রভাব রাখে না)।
আইটেমগুলির m1
মধ্যে পুনরুক্তি করার সময় কীটির মান হ'ল এই "পুনরাবৃত্তি" এর সাথে ট্যাগ করা অনুক্রমগুলিতে toflatten
, তবে অন্যান্য তালিকাগুলি (উপজাত বা না) একক আইটেম হিসাবে প্রদর্শন করে lays
পাইথন কোডটি অর্জনের একটি সম্ভাব্য উপায় হ'ল:
import sys
from pathlib import Path
import ruamel.yaml
yaml = ruamel.yaml.YAML()
@yaml.register_class
class Flatten(list):
yaml_tag = u'!flatten'
def __init__(self, *args):
self.items = args
@classmethod
def from_yaml(cls, constructor, node):
x = cls(*constructor.construct_sequence(node, deep=True))
return x
def __iter__(self):
for item in self.items:
if isinstance(item, ToFlatten):
for nested_item in item:
yield nested_item
else:
yield item
@yaml.register_class
class ToFlatten(list):
yaml_tag = u'!toflatten'
@classmethod
def from_yaml(cls, constructor, node):
x = cls(constructor.construct_sequence(node, deep=True))
return x
data = yaml.load(Path('input.yaml'))
for item in data['m1']:
print(item)
কোন ফলাফল:
1
2
[3, 4]
[5, 6]
7
8
আপনি দেখতে পাচ্ছেন যে, ক্রমানুসারে যা সমতলকরণ প্রয়োজন, আপনি একটি ট্যাগ্স সিকোয়েন্সে একটি উপনাম ব্যবহার করতে পারেন বা আপনি ট্যাগযুক্ত ক্রম ব্যবহার করতে পারেন। YAML আপনাকে করতে দেয় না:
- !flatten *x2
, অর্থাত্ একটি নোঙ্গরযুক্ত ক্রম ট্যাগ করুন, কারণ এটি এটিকে মূলত একটি আলাদা ডেটাস্ট্রাক্টারে পরিণত করে।
ব্যবহার স্পষ্ট ট্যাগ আইএমও কিছু জাদু YAML একত্রীকরণ কী এর মাধ্যমে যেমন চলছে থাকার চেয়ে ভাল <<
। যদি আপনার আর কোনও কিছুই না হয় তবে আপনি যদি ম্যাপিংয়ের সাথে একটি ওয়াইএএমএল ফাইল <<
রাখেন যা একটি কী রয়েছে
যা আপনি কোনও মার্জ কী এর মতো কাজ করতে চান না, যেমন আপনি যখন সি অপারেটরদের বিবরণে ম্যাপিং করেন তখন ইংরাজীতে (বা অন্য কোনও প্রাকৃতিক ভাষায়)।