وحدة reprlib‎ في بايثون

من موسوعة حسوب
مراجعة 19:18، 25 أغسطس 2018 بواسطة Mohammed Taher (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)


تقدّم وحدة reprlib وسيلة لإنتاج تمثيلات للكائنات مع إمكانية تحديد حجم السلسلة النصية الناتجة. تستخدم هذه الوحدة في منقّح بايثون وقد تكون مفيدة في سياقات أخرى أيضًا.

الواجهة البرمجية لوحدة reprlib

تقدّم هذه الوحدة صنفًا ونسخة صنف ودالة:

الصنف reprlib.Repr

يقدّم هذا الصنف خدمات تنسيق يمكن الاستفادة منها في إنشاء دوال مشابهة للدالة الداخلية repr()‎. ولتجنّب إنشاء تمثيلات ذات أحجام كبيرة جدًّا، فإنّ أحجام أنواع البيانات المستخدمة في هذا الصنف تكون محدّدة.

نسخة الصنف reprlib.aRepr

نسخة من الصنف Repr تستخدم لتقديم تابع repr()‎ الموصوف أدناه. يؤدي تغيير خصائص هذا الكائن إلى التأثر على حدود الأحجام المستخدمة بواسطة التابع repr()‎ ومنقّح بايثون.

التابع reprlib.repr(obj)‎

تابع repr()‎ الخاصّ بالكائن aRepr. يعيد هذا التابع سلسلة نصية مشابهة لتلك التي تعيدها الدالة الداخلية التي تحمل الاسم ذاته، ولكن مع فرض قيود على أحجام معظم أنواع البيانات.

المزخرف ‎‎@reprlib.recursive_repr(fillvalue="...")‎‎

وإضافة إلى ما سبق، تقدّم الوحدة مزخرفًا للكشف عن الاستدعاءات التعاودية للتابع ‎__repr__()‎ ووضع سلسلة نصّية مكانها. في حال ظهور استدعاء تعاودي، يعيد التابع القيمة المحدّدة في المعامل fillvalue، وفيما عدا ذلك يُستدعى التابع ‎__repr__()‎ بصورة طبيعية.

ملاحظة: هذا المزخرف جديد في الإصدار 3.2 من اللغة.

مثال:

>>> from reprlib import recursive_repr
>>> class MyList(list):
...     @recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>

كائنات Repr

تقدّم كائنات Repr عددًا من الخصائص التي يمكن استخدامها لتعيين حدود لأحجام التمثيلات الخاصّة بأنواع مختلفة من الكائنات، إضافة إلى توابع تعمل على تنسيق أنواع معيّنة من الكائنات.

الخاصية Repr.maxlevel

الحدّ الأقصى للعمق الذي يمكن الوصول إليه في إنشاء تمثيلات تعاودية. القيمة الافتراضية هي 6.

الخاصية Repr.maxdict

الخاصية Repr.maxlist

الخاصية Repr.maxtuple

الخاصية Repr.maxset

الخاصية Repr.maxfrozenset

الخاصية Repr.maxdeque

الخاصية Repr.maxarray

الحدّ الأقصى للمدخلات الممثلة للكائن المسمّى في الخاصية. القيمة الافتراضية هي 4 للخاصية maxdict، و 5 للخاصية maxarray و 6 للخصائص الأخرى.

الخاصية Repr.maxlong

أقصى عدد من الحروف في تمثيل الأعداد الصحيحة. تحذف الأرقام من الوسط، والقيمة الافتراضية هي 40.

الخاصية Repr.maxstring

أقصى عدد من الحروف في تمثيل السلسلة النصية. لاحظ أنّ التمثيل العادي للسلسلة النصية يُستخدم كمصدر للحروف. قد يؤدي تقليص حجم التمثيل إلى إفساد تسلسلات التهريب التي قد تكون مطلوبة في التمثيل. القيمة الافتراضية لهذه الخاصية هي 30.

الخاصية Repr.maxother

تُستخدم هذه الخاصية للتحكم في حجم الكائنات التي لا تتوفّر في كائن Repr توابع خاصّة لتنسيقها. وتطبّق هذه الخاصية بنفس طريقة تطبيق الخاصية maxstring. القيمة الافتراضية هي 20.

التابع Repr.repr(obj)‎‎

هذا التابع مكافئ للدالة الداخلية repr()‎ والتي تستخدم التنسيقات المفروضة بواسطة الكائن.

التابع Repr.repr1(obj, level)‎‎

هذا التابع بمثابة أداة التعاود التي يستخدمها التابع repr()‎. يستخدم هذا التابع نوع الكائن المعطى لتحديد تابع التنسيق الذي يجب استدعاؤه، ثم تمرير الكائن ومستوى التعاود إليها. يجب أن تستدعي توابع التنسيق الخاصّة بنوع معيّن من الكائنات التابع repr1()‎ لتنفيذ عمليات التنسيق التعاودية، وتكون قيمة level في الاستدعاء التعاودي مساوية للقيمة level - 1.

التابع Repr.repr_TYPE(obj, level)‎‎

تنفّذ توابع التنسيق الخاصّة بأنواع معيّنة كتوابع تحمل اسمًا يعتمد على اسم النوع. يجري استبدال كلمة TYPE في اسم التابع بواسطة التعبير ‎'_'.join(type(obj).__name__.split())‎. وتُرسل المعلومات إلى هذه التوابع عن طريق التابع repr1()‎. أما توابع التنسيق الخاصّة بأنواع معيّنة والتي تحتاج إلى إجراء عمليات تنسيق تعاودية على قيمة معيّنة، فيجب أن تستدعي التابع self.repr1(subobj, level -1)‎.

تفريع كائنات Repr

يتيح إرسال البيانات الديناميكي بواسطة التابع Repr.repr1()‎ تفريع كائنات Repr لدعم المزيد من أنواع الكائنات الداخلية أو لتعديل طريقة التعامل مع الأنواع المدعومة فعلًا.

يبين المثال التالي كيفية إضافة دعم خاص لكائنات الملفات:

import reprlib
import sys

class MyRepr(reprlib.Repr):

    def repr_TextIOWrapper(self, obj, level):
        if obj.name in {'<stdin>', '<stdout>', '<stderr>'}:
            return obj.name
        return repr(obj)

aRepr = MyRepr()
print(aRepr.repr(sys.stdin))         # '<stdin>' تطبع

انظر أيضًا

  • دالة repr()‎: تعيد الدّالة سلسلة نصيّة تحتوي على تمثيل قابل للطّباعة للكائن المُعطى.

مصادر

صفحة Alternate repr() implementation في توثيق بايثون الرسمي.