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)
أفضل الممارسات لمعالجة الأخطاء
- التحقق من وجود الملف: تأكد من وجود الملف، وإذا لم يكن موجوداً أظهر رسالة خطأ مناسبة.
- معالجة أخطاء التحليل: في حال وجود خطأ في صياغة YAML، التقط الاستثناء وقدم رسالة توضيحية.
- تسجيل الأخطاء: عند حدوث مشكلة، قم بتسجيل رسالة الخطأ في ملف السجلات (Logs) لسهولة استكشاف الأخطاء لاحقاً.
6. الخلاصة
YAML هو صيغة لتسلسل البيانات تتميز بالبساطة وسهولة القراءة. التعامل مع YAML في Python سهل للغاية، مما يجعله مثالياً لإدارة ملفات الإعداد. كما يمكن استخدامه في عمليات أكثر تقدماً مثل إنشاء وسوم مخصصة، تسلسل الكائنات، والحفاظ على ترتيب المفاتيح.
استخدام YAML لا يقتصر فقط على إدارة الإعدادات، بل يمكن استخدامه أيضاً كصيغة لحفظ البيانات في مشاريع متعددة، ومن المتوقع أن يزداد الاعتماد عليه في المستقبل في العديد من المجالات البرمجية.