ما هو YAML؟ شرح مبسط مع أمثلة عملية في Python

1. ما هو YAML؟

نظرة عامة على YAML

YAML (YAML Ain’t Markup Language) هو أحد صيغ تسلسل البيانات، ويُستخدم على نطاق واسع لتمثيل البيانات المُهيكلة. يشبه JSON وXML، لكن ما يميز YAML هو بساطته وقابليته العالية للقراءة. على وجه الخصوص، يمكن التعبير عن البُنى الهرمية باستخدام المسافات البادئة (Indentation)، مما يجعله سهل القراءة للبشر.

الاختلافات بين JSON وXML

JSON وXML هما أيضاً صيغ لتمثيل البيانات، لكن YAML يتميز عنهما بكونه أقل اعتماداً على الرموز الزائدة، وأكثر وضوحاً وبساطة. على سبيل المثال، يستخدم JSON الأقواس {} والفواصل , بشكل متكرر، مما قد يقلل من وضوح البيانات عند التعامل مع مجموعات كبيرة. بينما في YAML يتم استخدام المسافات البادئة لعرض البنية، مما يسهل فهم مستويات البيانات بشكل مرئي.

التوافق الجيد مع Python

بما أن لغة Python تعتمد على المسافات البادئة لتحديد الكتل البرمجية، فهي متوافقة بشكل كبير مع صيغة YAML. باستخدام مكتبة PyYAML في Python، يمكن بسهولة قراءة وكتابة ملفات YAML، ولهذا السبب تُستخدم غالباً كملفات إعداد (Configuration Files).

2. كيفية قراءة وكتابة ملفات YAML باستخدام Python

قراءة ملفات YAML

لقراءة ملف YAML في Python، يجب أولاً تثبيت مكتبة PyYAML واستخدام الدالة yaml.safe_load(). تقوم هذه الدالة بتحويل بيانات YAML إلى كائنات Python مثل القواميس والقوائم. المثال التالي يوضح كيفية القيام بذلك:

import yaml

# فتح ملف YAML وقراءة محتواه
with open('config.yaml', 'r') as file:
    data = yaml.safe_load(file)

print(data)

هذا الكود يقرأ البيانات من ملف YAML ويحولها إلى قاموس في Python. على سبيل المثال، إذا كان لدينا الملف التالي:

database:
  host: localhost
  port: 3306

فسيتم تحويله في Python إلى:

{'database': {'host': 'localhost', 'port': 3306}}

كتابة ملفات YAML

لتحويل بيانات Python إلى صيغة YAML وكتابتها في ملف، نستخدم الدالة yaml.dump(). المثال التالي يوضح كيفية كتابة قاموس Python إلى ملف YAML:

import yaml

data = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}

with open('output.yaml', 'w') as file:
    yaml.dump(data, file)

في هذا المثال، يتم حفظ القاموس data في ملف باسم output.yaml. وستكون النتيجة على النحو التالي:

age: 30
city: New York
name: John Doe

التعامل مع اللغة اليابانية

عند التعامل مع اللغة اليابانية أو النصوص غير اللاتينية في YAML، من المهم استخدام الخيار allow_unicode=True لتجنب مشاكل الترميز وضمان عرض صحيح:

yaml.dump(data, file, allow_unicode=True)

3. عمليات متقدمة على YAML

إنشاء وسوم مخصصة

لا يقتصر YAML على القوائم والقواميس فقط، بل يمكنه أيضاً تسلسل (Serialize) وإعادة بناء (Deserialize) كائنات Python باستخدام وسوم مخصصة. المثال التالي يوضح كيفية حفظ كائن Python في YAML:

import yaml

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def person_representer(dumper, data):
    return dumper.represent_mapping('!Person', {'name': data.name, 'age': data.age})

def person_constructor(loader, node):
    values = loader.construct_mapping(node)
    return Person(values['name'], values['age'])

yaml.add_representer(Person, person_representer)
yaml.add_constructor('!Person', person_constructor)

# تحويل كائن إلى YAML وحفظه
person = Person('Alice', 25)
with open('person.yaml', 'w') as file:
    yaml.dump(person, file)

# إعادة بناء الكائن من ملف YAML
with open('person.yaml', 'r') as file:
    loaded_person = yaml.load(file, Loader=yaml.FullLoader)

بهذه الطريقة يمكن حفظ كائنات Python في YAML بصيغة مخصصة وإعادة استخدامها لاحقاً.

الحفاظ على الترتيب

بشكل افتراضي لا يحتفظ PyYAML بترتيب المفاتيح في القواميس. لذلك عند الحاجة إلى الحفاظ على الترتيب، يُوصى باستخدام مكتبة ruamel.yaml التي تحتفظ بترتيب المفاتيح وهو أمر مهم خاصة لملفات الإعدادات الحساسة.

4. أمثلة على استخدام YAML: إدارة ملفات الإعداد

سهولة استخدام YAML كملفات إعداد

يُستخدم YAML على نطاق واسع كصيغة لملفات الإعداد. يتميز بكونه قابلاً للقراءة وسهل الفهم بفضل البنية الهرمية باستخدام المسافات البادئة. هذا يجعله مثالياً لإدارة إعدادات التطبيقات مثل معلومات قاعدة البيانات أو إعدادات تسجيل الدخول.

database:
  host: localhost
  port: 3306
  username: user
  password: pass

logging:
  level: DEBUG
  file: /var/log/app.log

كما نرى أعلاه، يمكن وصف إعدادات متعددة بشكل مختصر وواضح.

استخدام YAML في المشاريع الفعلية

يُستخدم YAML في العديد من المشاريع مثل أُطر Python (Django وFlask)، أدوات التكامل المستمر (CircleCI)، وأدوات إدارة الحاويات (Kubernetes). في هذه المشاريع، غالباً ما يُستخدم YAML لإدارة الإعدادات وتعريف المتغيرات البيئية.

مثال على استخدام YAML مع Django:

في مشاريع Django، يمكن استخدام YAML لقراءة ملفات الإعداد الخارجية مما يُبسط عملية النشر وبناء بيئات التطوير والإنتاج.

import yaml

with open('config.yaml', 'r') as file:
    config = yaml.safe_load(file)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': config['database']['name'],
        'USER': config['database']['username'],
        'PASSWORD': config['database']['password'],
        'HOST': config['database']['host'],
        'PORT': config['database']['port'],
    }
}

مقارنة YAML مع JSON وXML

يمتاز YAML بسهولة الاستخدام مقارنة بـ JSON وXML. ففي JSON يتم استخدام الأقواس والفواصل مما قد يجعل الملفات الطويلة صعبة القراءة. أما XML فيتطلب وسوم البداية والنهاية، ما يجعله مطولاً. بينما YAML يعتمد على المسافات البادئة لعرض البنية، مما يسهل استيعاب محتوى ملفات الإعداد بشكل بديهي.

مقارنة بين JSON وYAML:

{
  "database": {
    "host": "localhost",
    "port": 3306,
    "username": "user",
    "password": "pass"
  },
  "logging": {
    "level": "DEBUG",
    "file": "/var/log/app.log"
  }
}
database:
  host: localhost
  port: 3306
  username: user
  password: pass

logging:
  level: DEBUG
  file: /var/log/app.log

من الواضح أن YAML أبسط وأكثر سهولة في القراءة مقارنةً بـ JSON.

年収訴求

5. استكشاف الأخطاء ومعالجة الأخطاء في YAML

الأخطاء الشائعة وكيفية التعامل معها

أحد أكثر الأخطاء شيوعاً عند التعامل مع ملفات YAML هو “عدم وجود الملف” أو “الملف ليس بالتنسيق الصحيح”. يمكن معالجة هذه المشكلات من خلال تنفيذ أسلوب صحيح لمعالجة الأخطاء.

على سبيل المثال، عند حدوث خطأ في تحليل ملف YAML يمكن التقاط الاستثناء باستخدام yaml.YAMLError. أما إذا لم يكن الملف موجوداً فيمكن التعامل مع الاستثناء FileNotFoundError لإظهار رسالة مناسبة للمستخدم.

import yaml

def load_yaml(file_path):
    try:
        with open(file_path, 'r') as file:
            data = yaml.safe_load(file)
    except FileNotFoundError:
        print(f"Error: The file {file_path} does not exist.")
        return None
    except yaml.YAMLError as e:
        print(f"Error: Failed to parse YAML file. {e}")
        return None
    return data

config = load_yaml('config.yaml')
if config:
    print(config)

أفضل الممارسات لمعالجة الأخطاء

  1. التحقق من وجود الملف: تأكد من وجود الملف، وإذا لم يكن موجوداً أظهر رسالة خطأ مناسبة.
  2. معالجة أخطاء التحليل: في حال وجود خطأ في صياغة YAML، التقط الاستثناء وقدم رسالة توضيحية.
  3. تسجيل الأخطاء: عند حدوث مشكلة، قم بتسجيل رسالة الخطأ في ملف السجلات (Logs) لسهولة استكشاف الأخطاء لاحقاً.

6. الخلاصة

YAML هو صيغة لتسلسل البيانات تتميز بالبساطة وسهولة القراءة. التعامل مع YAML في Python سهل للغاية، مما يجعله مثالياً لإدارة ملفات الإعداد. كما يمكن استخدامه في عمليات أكثر تقدماً مثل إنشاء وسوم مخصصة، تسلسل الكائنات، والحفاظ على ترتيب المفاتيح.

استخدام YAML لا يقتصر فقط على إدارة الإعدادات، بل يمكن استخدامه أيضاً كصيغة لحفظ البيانات في مشاريع متعددة، ومن المتوقع أن يزداد الاعتماد عليه في المستقبل في العديد من المجالات البرمجية.