কোনও তালিকা বা মানচিত্রের অংশ ভাগ করার জন্য কি ওয়ামএএমএল সিনট্যাক্স রয়েছে?


95

সুতরাং, আমি জানি আমি এরকম কিছু করতে পারি:

sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist: *sites

এবং আছে sitelistএবং anotherlistউভয় ধারণ করে www.foo.comএবং www.bar.com। তবে কি আমি সত্যিই চান তাদের জন্য রয়েছে anotherlistকরার এছাড়াও ধারণ www.baz.comপুনরাবৃত্তি ছাড়াই www.foo.comএবং www.baz.com

এটি করা আমাকে ওয়াইএএমএল পার্সারে একটি সিনট্যাক্স ত্রুটি দেয়:

sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist: *sites
  - www.baz.com

কেবলমাত্র অ্যাঙ্কর এবং উপকরণ ব্যবহার করে আমি অন্য স্তরের কাঠামো যুক্ত না করে যা চাই তা করা সম্ভব বলে মনে হচ্ছে না যেমন:

sitelist: &sites
  - www.foo.com
  - www.bar.com

anotherlist:
  - *sites
  - www.baz.com

যার অর্থ এই ওয়াইএএমএল ফাইলের গ্রাহককে এটি সম্পর্কে সচেতন হতে হবে।

এরকম কিছু করার কি কোনও খাঁটি YAML উপায় আছে? বা আমাকে কি ওয়াইএএমএল-পরবর্তী কিছু প্রক্রিয়া ব্যবহার করতে হবে, যেমন ভেরিয়েবল সাবস্টিটিউশন বাস্তবায়ন বা নির্দিষ্ট ধরণের কাঠামোর স্বয়ংক্রিয়ভাবে উত্তোলন? আমি ইতিমধ্যে বেশ কয়েকটি অন্যান্য ব্যবহারের কেস পরিচালনা করতে এই জাতীয় পোস্ট-প্রসেসিং করছি, সুতরাং আমি এটির বিরুদ্ধে পুরোপুরি বিরূপ নই। তবে আমার ওয়াইএএমএল ফাইলগুলি মেশিন দ্বারা উত্পাদিত নয়, মানুষের দ্বারা লিখিত হতে চলেছে, তাই আমি স্ট্যান্ডার্ড ওয়াইএএমএল সিনট্যাক্সের শীর্ষে আমার ব্যবহারকারীদের দ্বারা যে নিয়মগুলি মুখস্থ করা দরকার তা হ্রাস করতে চাই।

আমি মানচিত্রের সাথে অভিন্ন জিনিস করতে সক্ষম হতে চাই:

namedsites: &sites
  Foo: www.foo.com
  Bar: www.bar.com

moresites: *sites
  Baz: www.baz.com

আমি ওয়াইএএমএল অনুমানের মাধ্যমে অনুসন্ধান করেছি এবং কিছুই খুঁজে পাইনি, তাই আমার সন্দেহ হয় উত্তরটি "" আপনি এটি করতে পারবেন না "কেবল তাই। তবে কারও যদি এমন কোনও ধারণা থাকে যা দুর্দান্ত be


সম্পাদনা: যেহেতু কোনও উত্তর নেই, তাই আমি অনুমান করছি যে ওয়াইএএমএল অনুপস্থিতিতে আমি যা কিছু পাইনি তা কেউই স্পট করেনি এবং এটি ওয়াইএএমএল স্তরে করা যায় না। সুতরাং আমি ভবিষ্যতে যদি এই প্রশ্নটি খুঁজে পায়, ক্ষেত্রে এই ক্ষেত্রে সহায়তা করার জন্য ওয়াইএএমএল পোস্ট-প্রসেসিংয়ের জন্য ধারণাটি আমি উদ্বোধন করছি।


দ্রষ্টব্য: এই ইস্যুটি ওয়াইএএমএলে অ্যাঙ্করগুলি এবং উপমাগুলির স্ট্যান্ডার্ড ব্যবহারের সাথেও মোকাবিলা করা যেতে পারে। আরও দেখুন: YAML অ্যারেগুলিকে কীভাবে মার্জ করবেন?
dreftymac

উত্তর:


53

মার্জ কী টাইপ সম্ভবত আপনি চান। এটি <<মার্জগুলিকে চিহ্নিত করার জন্য একটি বিশেষ ম্যাপিং কী ব্যবহার করে ম্যাপিংয়ের একটি উপাত্তকে (বা এই জাতীয় উপকরণগুলির একটি ক্রম) একক ম্যাপিংয়ে মার্জ করার জন্য আরম্ভকারী হিসাবে ব্যবহার করার অনুমতি দেয়। অতিরিক্তভাবে, আপনি এখনও স্পষ্টভাবে মানগুলি ওভাররাইড করতে পারেন, বা আরও সংযোজন করতে পারেন যা মার্জ তালিকায় উপস্থিত ছিল না।

এটি লক্ষণীয় গুরুত্বপূর্ণ যে এটি ম্যাপিংয়ের সাথে কাজ করে, আপনার প্রথম উদাহরণ হিসাবে অনুক্রম নয়। আপনি যখন এটি সম্পর্কে ভাবেন তখন এটি বোধগম্য হয় এবং আপনার উদাহরণটি দেখে মনে হয় এটি সম্ভবত কোনওভাবেই অনুক্রমিক হওয়ার দরকার নেই। ম্যাপিং কীগুলিতে কেবল আপনার সিক্যুয়েন্সের মানগুলি পরিবর্তন করা কৌশলটি করা উচিত, যেমন নিম্নলিখিত (অরীক্ষিত) উদাহরণ হিসাবে:

sitelist: &sites
  ? www.foo.com  # "www.foo.com" is the key, the value is null
  ? www.bar.com

anotherlist:
  << : *sites    # merge *sites into this mapping
  ? www.baz.com  # add extra stuff

কিছু বিষয় লক্ষণীয়। প্রথমত, যেহেতু <<একটি কী, এটি প্রতি নোডের মধ্যে একবার নির্দিষ্ট করা যেতে পারে। দ্বিতীয়ত, মান হিসাবে ক্রম ব্যবহার করার সময়, ক্রমটি তাৎপর্যপূর্ণ। এখানে উদাহরণ হিসাবে এটি গুরুত্বপূর্ণ নয়, যেহেতু এখানে কোনও মান সম্পর্কিত নয়, তবে এটি সচেতন হওয়া জরুরী।


আহ, আপনাকে ধন্যবাদ! এটা বেশ সহায়ক। যদিও এটি সিকোয়েন্সগুলির জন্য কাজ করে না এটি লজ্জাজনক। আপনি ঠিক বলেছেন যে এই উদাহরণটির জন্য আদেশটি গুরুত্বপূর্ণ নয়; আমার কাছে যা আছে তা ধারণামূলকভাবে একটি সেট, তবে এটি ম্যাপিংয়ের চেয়ে ক্রমটির সাথে আরও অনেক বেশি ঘনিষ্ঠভাবে মানচিত্র করে। এবং আমি এই বিষয়গুলির বাইরে যা পাই তার কাঠামো (যে কারণে আমি কেবল আমার কাঠামোগুলিকে মার্জ করার জন্য নীড়ের আরও একটি স্তর যুক্ত করতে চাইনি), সুতরাং একটি ম্যাপিং রয়েছে যার জন্য আমাকে (সমস্ত নাল) মানগুলি অগ্রাহ্য করতে হবে সত্যিই কাজ করবে না।
বেন

4
আমি বর্তমান অফিসিয়াল ওয়াইএএমএল বিশেষে এটিতে কিছুই দেখতে পাচ্ছি না: yaml.org/spec/1.2/spec.html । এই পৃষ্ঠায় "মার্জ" শব্দ এবং "<<" পাঠ্য বা "কী টাইপ" শব্দটি নেই। << সিনট্যাক্স যদিও পাইথন ইয়ামল প্যাকেজে কাজ করে। আপনি কি জানেন যে আমি এই ধরণের অতিরিক্ত বৈশিষ্ট্যগুলি সম্পর্কে আরও কোথায় জানতে পারি?
বেন

4
এটি সরাসরি অনুমেয় নয়, এটি ট্যাগের সংগ্রহশালায় বর্ণিত। অন্যান্য স্কিমার একটি সাধারণ বিবরণ এবং লিঙ্ক রয়েছে। মার্জ কীগুলি ছাড়াও, সেটগুলি এবং অর্ডার করা সেটগুলিও রয়েছে; তবে, ওয়াইএএমএল সেটগুলিকে এক ধরণের ম্যাপিং হিসাবে বিবেচনা করে (যেমন উপরের উদাহরণটি সেট হিসাবে প্রয়োগ করা যেতে পারে)। আপনার ভাষা কি আপনাকে ফলস্বরূপ ম্যাপিংয়ে মানগুলি দিয়ে কীগুলি অদলবদল করতে দেয়? এমনকি যদি আপনাকে এটি নিজে প্রয়োগ করতে হয় তবে আমার ধারণা এটি পরিষ্কার হয়ে যাবে; আপনার কমপক্ষে সমস্ত ডেটা একসাথে ইতিমধ্যে গোষ্ঠীযুক্ত করা হবে এবং আপনার ওয়াইএএমএল মানক হবে।
Kittemon

সেটগুলি ম্যাপিং নয় যদিও; একটি ম্যাপিং হ'ল কী-মূল্য সংঘের একটি সেট। আমি যখন yaml.load(...)পাইথনে থাকি, তখন একটি ওয়াইএএমএল ম্যাপিংয়ের উপস্থাপনা হিসাবে আমি একটি অভিধান পাই। হ্যাঁ, সেট-এ পোস্ট-প্রক্রিয়া করা সহজ, তবে আমাকে জানতে হবে যে এটি ঘটেছে (এবং কনফিগারেশন ফাইলগুলি পড়ার / লেখার সময় শব্দসংক্রান্ত জটিলতা যদি নিয়মটি "সেটগুলি নাল মান হিসাবে মানচিত্রে লেখা হয়") তখন উচ্চতর হয় )। প্রদত্ত yaml.load(...)ডেটা আমি ব্যবহার করি <<বা না সেগুলির মধ্যে একটি পোস্ট প্রসেসিং প্রয়োজন এবং আমি MERGEসম্ভবত এটির সাথে থাকব MERGE(যা আমি ইতিমধ্যে ইতিমধ্যে বাস্তবায়ন করেছি)।
বেন

4
হ্যাঁ, আমি সেগুলি খুঁজে পেয়েছি !!set। যদিও খুব বেশি অস্পষ্ট বয়লারপ্লেট। এই ফাইলগুলি মানুষের পাঠযোগ্য / লেখার যোগ্য হয়ে ওঠে, এমন লোকেরা যারা প্রয়োজনীয়ভাবে ওয়াইএএমএল বিশেষজ্ঞ নয় by লোকেরা তাদের সাইটের তালিকাগুলি ওয়াইএএমএল তালিকা হিসাবে লিখতে চলেছে, তারপরে সেগুলিকে একীভূত করতে এবং পুরো জিনিসটিকে একটি সেটে রূপান্তর করতে হবে এবং এটিকে একটি সেট হিসাবে স্পষ্টতই ট্যাগ করতে ভুলবেন না ... আমার কাছে আরও কয়েকটি মানক পোস্ট রয়েছে- MERGEযাইহোক যাইহোক জিনিস প্রসেসিং । তারপরও আপনার সাহায্যের জন্য ধন্যবাদ!
বেন

17

পূর্ববর্তী উত্তরগুলি যেমন উল্লেখ করেছে, ওয়াইএএমএলে তালিকাগুলি বাড়ানোর পক্ষে কোনও অন্তর্নির্মিত সমর্থন নেই। আমি নিজে এটি প্রয়োগ করার জন্য আরও একটি উপায় অফার করছি। এই বিবেচনা:

defaults: &defaults
  sites:
    - www.foo.com
    - www.bar.com

setup1:
  <<: *defaults
  sites+:
    - www.baz.com

এটিতে প্রক্রিয়া করা হবে:

defaults:
  sites:
    - www.foo.com
    - www.bar.com

setup1:
  sites:
    - www.foo.com
    - www.bar.com
    - www.baz.com

ধারণাটি হ'ল একটি '+' দিয়ে শেষ হওয়া কীগুলির বিষয়বস্তু '+' ছাড়াই সংশ্লিষ্ট কীতে মার্জ করা। আমি পাইথনে এটি প্রয়োগ করেছি এবং এখানে প্রকাশ করেছি ।

উপভোগ করুন!


4
দ্রষ্টব্য: এই ইস্যুটি ওয়াইএএমএলে অ্যাঙ্করগুলি এবং উপকরণগুলির স্ট্যান্ডার্ড ব্যবহারের সাথেও মোকাবিলা করা যেতে পারে। আরও দেখুন: YAML অ্যারেগুলিকে কীভাবে মার্জ করবেন?
dreftymac

12
এর অর্থ কী এই পন্থাটি কেবল একটি পৃথক সরঞ্জামের সাথে কাজ করে যা মার্জ করে sitesএবং sites+। আমি বলতে চাইছি এমন একটি সরঞ্জাম যা ব্যবহারকারীর দ্বারা প্রয়োগ করা উচিত কারণ এটি কোনও ডিফল্ট yamlআচরণ নয়?
stan0

7

(আমি যে সমাধানটি ব্যবহার করছি সে ক্ষেত্রে আমার নিজের প্রশ্নের উত্তর দেওয়া যিনি ভবিষ্যতে যাকে অনুসন্ধান করেন তার পক্ষে কার্যকর)

এটি করার কোনও খাঁটি-ইয়ামএল উপায় না নিয়ে, আমি এটিকে "সিনট্যাক্স রূপান্তর" হিসাবে ওয়াইএএমএল পার্সার এবং কোডটির মধ্যে বসিয়ে যা কনফিগারেশন ফাইলটি আসলে ব্যবহার করে। সুতরাং আমার মূল অ্যাপ্লিকেশনটিকে কোনও মানব-বান্ধব অপ্রয়োজনীয়-পরিহারের ব্যবস্থা সম্পর্কে মোটেই চিন্তা করার দরকার নেই, এবং কেবল ফলাফলের কাঠামোর উপর সরাসরি কাজ করতে পারে।

যে কাঠামোটি আমি ব্যবহার করতে চলেছি তা দেখতে এমন দেখাচ্ছে:

foo:
  MERGE:
    - - a
      - b
      - c
    - - 1
      - 2
      - 3

যা এর সমতুল্যে রূপান্তরিত হবে:

foo:
  - a
  - b
  - c
  - 1
  - 2
  - 3

অথবা, মানচিত্র সহ:

foo:
  MERGE:
    - fork: a
      spoon: b
      knife: c
    - cup: 1
      mug: 2
      glass: 3

রূপান্তরিত হবে:

foo:
  fork: a
  spoon: b
  knife: c
  cup: 1
  mug: 2
  glass: 3

আরও আনুষ্ঠানিকভাবে, ওয়াইএএমএল পার্সারকে একটি কনফিগার ফাইল থেকে নেটিভ অবজেক্টগুলি পাওয়ার জন্য কল করার পরে, তবে অ্যাপ্লিকেশনটির বাকী অংশে যাওয়ার আগে, আমার অ্যাপ্লিকেশনটি একক কীযুক্ত ম্যাপিংগুলি সন্ধান করার জন্য অবজেক্ট গ্রাফটি হাঁটবে MERGE। এর সাথে সম্পর্কিত মানটি MERGEহয় তালিকার একটি তালিকা বা মানচিত্রের তালিকা হতে হবে; অন্য কোনও কাঠামো একটি ত্রুটি।

তালিকাগুলির তালিকার ক্ষেত্রে, সমস্ত মানচিত্রযুক্ত MERGEচাইল্ড তালিকাগুলি তাদের উপস্থিত ক্রম অনুসারে একত্রে প্রতিস্থাপন করবে।

মানচিত্রের তালিকার ক্ষেত্রে, সমস্ত মানচিত্র সমন্বিত MERGEএকক মানচিত্রে শিশু মানচিত্রে সমস্ত কী / মান জোড়া যুক্ত করে প্রতিস্থাপন করা হবে। কীগুলিতে ওভারল্যাপ রয়েছে, MERGEতালিকার সর্বশেষে প্রাপ্ত চাইল্ড ম্যাপের মানটি ব্যবহার করা হবে।

উপরে বর্ণিত উদাহরণগুলি তেমন কার্যকর নয়, যেহেতু আপনি সরাসরি যে কাঠামোটি চেয়েছিলেন তা কেবল আপনি লিখতে পারতেন। এটি প্রদর্শিত হওয়ার সম্ভাবনা বেশি:

foo:
  MERGE:
    - *salt
    - *pepper

আপনি একটি তালিকা তৈরি করতে অনুমতি অথবা মানচিত্রে নোড সবকিছু ধারণকারী saltএবং pepperঅন্যত্র ব্যবহার করা হচ্ছে।

(আমি এই foo:বাহ্যিক মানচিত্রটি দেখানোর জন্য দিচ্ছি যে এটির ম্যাপিংয়ের MERGEঅবশ্যই একমাত্র চাবি হওয়া আবশ্যক , যার অর্থ MERGEঅন্য শীর্ষ স্তরের নাম না থাকলে কোনও শীর্ষ-স্তরের নাম হিসাবে উপস্থিত হতে পারে না)


6

এখানে দুটি উত্তর থেকে কিছু পরিষ্কার করার জন্য, তালিকাগুলির জন্য এটি সরাসরি ওয়াইএএমএলে সমর্থিত নয় (তবে এটি অভিধানের জন্য সমর্থিত, কিটটেমনের উত্তর দেখুন)।


দ্রষ্টব্য: এই ইস্যুটি ওয়াইএএমএলে অ্যাঙ্করগুলি এবং উপকরণগুলির স্ট্যান্ডার্ড ব্যবহারের সাথেও মোকাবিলা করা যেতে পারে। আরও দেখুন: YAML অ্যারেগুলিকে কীভাবে মার্জ করবেন?
dreftymac

5

Kittemon এর উত্তর পিগিগ্যাক করতে, নোট করুন যে আপনি বিকল্প বাক্য গঠন ব্যবহার করে নাল মান সহ ম্যাপিং তৈরি করতে পারেন

foo:
    << : myanchor
    bar:
    baz:

প্রস্তাবিত বাক্য বিন্যাসের পরিবর্তে

foo:
    << : myanchor
    ? bar
    ? baz

Kittemon এর পরামর্শ মত, এটি আপনাকে ম্যাপিং এর মধ্যে অ্যাঙ্করগুলির রেফারেন্স ব্যবহার করতে এবং সিকোয়েন্স ইস্যু এড়াতে অনুমতি দেবে। সিম্ফনি ইয়ামল উপাদান v2.4.4 ? barসিনট্যাক্সটি পুনরায় সনাক্ত করতে পারে না তা আবিষ্কার করার পরে আমি এটি করার দরকার পড়েছিলাম ।


দেখতে কেমন লাগে myanchor?
এসএসসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.