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

من موسوعة حسوب
< Python
مراجعة 19:06، 25 أغسطس 2018 بواسطة Mohammed Taher (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:وحدة <code>reprlib‎</code> في بايثون}}</noinclude> تقدّم وحدة reprlib وسيلة لإنتاج تمثيلات للكائ...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث


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

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

class reprlib.Repr

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


reprlib.aRepr

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

reprlib.repr(obj)

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

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

‎‎@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

الحدّ الأقصى للمدخلات الممثلة في التابع المسمّى. القيمة الافتراضية هي 6 للخاصية 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 في توثيق بايثون الرسمي.