تقوم سياسة بايثون على أن البرنامج يجب أن يكون مفهوم وسهل القراءة وسنناقش في هذه المقالة أحد جوانب الكود السهل.

لابد أنك لاحظت أن في كثير من الأحيان تكون الدالة أو أي جزء من الكود يكون على شكل كود استهلال معين ثم عملية ما ثم كود تنظيف قبل الخروج أو العودة

عندما يبدأ الكود بالتعقيد فيصبح هناك أكثر من مكان للخروج أو يصبح هناك معالجة للاستثناءات/الأخطاء من خلال عبارات التجربة try كل منها تحتاج لنفس كود التنظيف قبل الخروج.

بالمثال يمكننا أن نوضح هذه الفكرة فلنتخيل أن لدينا كود يفتح ملف ثم يحصل على قفل عليه ثم يقرأ شيء منه (الإزاحة مثلا) ثم يتحرك في الملف ليكتب شيء فيه ويعالج الإستثناءات مثل الخطأ في القراءة أو الخطأ في الكتابة ثم يحسب شيء ما ثم يعالج حالة القسمة على صفر ثم يعيد الناتج وفي كل حالة خروج يجب أن يحرر القفل ويغلق الملف تخيل في كم مكان سيتكرر ذلك.

لاحظ مصمموا بايثون ذلك واقترحوا الحل وقد أضيف في الإصدار 2.5 وهو الكائنات المديرة للسياق وعبارة المعية with وذلك في الوثيقة pep-0343

http://legacy.python.org/dev/peps/pep-0343/

الكائن المدير للسياق هو كائن ينفذ الدالتين الخاصتين __enter__ و __exit__ عند الدخول والخروج من السياق على الترتيب. ومن الأمثلة على كائنات السياق

  • كائن الملف

  • كائنات القفل المختلفة (الأقفال والشروط والحواجز)

مثال على ذلك:

import hashlib
def md5sum(filename):
    f=open(filename, 'r')
    with f:
        content=f.read()
        md5sum=hashlib.md5(content).hexdigest()
        return md5sum

أو بطريقة أبسط عبر استعمال as

import hashlib
def md5sum(filename):
    with open(filename, 'r') as f:
        return md5sum=hashlib.md5(f.read()).hexdigest()

سيتم إغلاق الملف close تلقائيا قبل العودة أو عند حدوث خطأ لأن مدير السياق الموجود في كائن الملف سينفذ ذلك.

مثال آخر

from threading import Lock
my_lock=Lock()
with lock:
    do_something()

مدير السياق في كائن القفل يعمل حجز acquire قبل الدخول ويتحرره release عند الخروج بأي طريقة (بما فيها حدوث خطأ استثنائي).