الفرق بين المراجعتين لصفحة: «Python/collections.abc»

من موسوعة حسوب
أنشأ الصفحة ب'تقدّم هذه الوحدة مجموعة من الأصناف الأساسية المجرّدة abstract base calsses (يرمز لها ABC اختصارًا) والتي...'
 
طلا ملخص تعديل
 
(9 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 1: سطر 1:
تقدّم هذه الوحدة مجموعة من الأصناف الأساسية المجرّدة abstract base calsses (يرمز لها ABC اختصارًا) والتي يمكن استخدامها للتأكد ممّا إذا كان صنف معيّن يقدّم واجهة معينة، كأن يكون الصنف قابلًا للتقطيع hashable أو أنّه صنف ربط mapping.
<noinclude>{{DISPLAYTITLE:الوحدة <code>collections.abc‎</code> في بايثون}}</noinclude>
تقدّم هذه الوحدة مجموعة من الأصناف الأساسية المجرّدة abstract base calsses (يرمز لها ABC اختصارًا) والتي يمكن استخدامها للتأكد ممّا إذا كان صنف معيّن يقدّم واجهة interface معينة، كأن يكون الصنف قابلًا للتقطيع hashable أو أنّه صنف ربط mapping.


ملاحظة:  
ملاحظة: قبل الإصدار 3.3 من اللغة كانت هذه الوحدة جزءًا من وحدة [[Python/collections|collections]].
قبل الإصدار 3.3 من اللغة كانت هذه الوحدة جزءًا من وحدة collections.


الأصناف الأساسية المجرّدة في الوحدة collections
== الأصناف الأساسية المجرّدة في الوحدة collections ==
تقدّم وحدة collections الأصناف الأساسية المجرّدة التالية:
تقدّم وحدة collections الأصناف الأساسية المجرّدة التالية:


class collections.abc.Container
{| class="wikitable"
class collections.abc.Hashable
!الصنف الأساسي المجرد
class collections.abc.Sized
!يرث من
class collections.abc.Callable
!التوابع المجرّدة
أصناف أساسية مجرّدة للأصناف التي تقدّم التوابع ‎__contains__()‎، ‎__hash__()‎، ‎__len__()و ‎__call__().
!توابع mixin
|-
|<code>Container</code>
|<code>__contains__</code>
|-
|<code>Hashable</code>
|<code>__hash__</code>
|-
|<code>Iterable</code>
|<code>__iter__</code>
|-
|<code>Iterator</code>
|<code>Iterable</code>
|<code>__next__</code>
|<code>__iter__</code>
|-
|<code>Reversible</code>
|<code>Iterable</code>
|<code>__reversed__</code>
|-
|<code>Generator</code>
|<code>Iterator</code>
|<code>send</code>، <code>throw</code>
|<code>close</code>، <code>__iter__</code>، <code>__next__‎</code>
|-
|<code>Sized</code>
|<code>__len__</code>
|-
|<code>Callable</code>
|<code>__call__</code>
|-
|<code>Collection</code>
|<code>Sized</code>،<code>Iterable</code>،<code>Container</code>
|<code>‎__‎contains__‎ ‎‎، ‎‎__iter__‎‎ ، ‎__len__‎‎‎‎</code>
|-
|<code>Sequence</code>
|<code>Reversible</code>،<code>Collection</code>
|<code>__getitem__</code>، <code>__len__</code>
|‎<code>__contains__</code>  ، <code>__iter__</code> ،  <code>__reversed__</code> ، <code>index</code> ،  <code>count</code>
|-
|<code>MutableSequence</code>
|<code>Sequence</code>
|‎<code>__getitem__ ‎</code>،<code>__setitem__</code>، <code>__delitem__</code>، <code>__len__</code>،  <code>insert</code>
|توابع <code>Sequence</code> الموروثة
و <code>append</code>، <code>reverse</code>، <code>extend</code>، <code>pop</code>، <code>remove</code>، و <code>__iadd__</code>
|-
|<code>ByteString</code>
|<code>Sequence</code>
|<code>__getitem__</code>، <code>__len__</code>
|توابع <code>Sequence</code> الموروثة
|-
|<code>Set</code>
|<code>Collection</code>
|‎<code>__contains__</code> ، <code>__iter__</code> ،<code>__len __‎</code>
|<code>‎__le__‎, ‎__lt__‎, ‎__eq__‎, ‎__ne__‎,‎__gt__‎, ‎__ge__‎, ‎__and__‎, ‎__or__‎,‎__sub__‎, ‎__xor__‎, isdisjoint</code>
|-
|<code>MutableSet</code>
|<code>Set</code>
|‎<code>__contains__</code> ، <code>__iter__</code> ،<code>__len__</code>، <code>add</code>،<code>discard</code>
|توابع <code>Sequence</code> الموروثة إضافة إلى التوابع
<code>clear</code>، <code>pop</code>، <code>remove</code>، <code>__ior__</code> ، <code>__iand__</code> ،‎ <code>__ixor‎__</code> ،  <code>__isub__‎</code>
|-
|<code>Mapping</code>
|<code>Collection</code>
|‎<code>__getitem__</code> ،<code>__iter__</code>،<code>__len__‎</code>
|‎‎<code>__contains__</code> ،  <code>keys</code> ،  <code>items</code> ، <code>values</code> ، <code>get</code>،  <code>__eq__‎‎</code> ،  و ‎<code>__ne__‎</code>
|-
|<code>MutableMapping</code>
|<code>Mapping</code>
|<code>__getitem__</code>، <code>__setitem__</code> ،<code>__delitem__</code> ،<code>__iter__</code> ،<code>__len__‎</code>
|توابع <code>Mapping</code> الموروثة و <code>pop</code>، <code>popitem</code>، <code>clear</code>، <code>update</code>، و <code>setdefault</code>
|-
|<code>MappingView</code>
|<code>Sized</code>
|<code>__len__</code>
|-
|<code>ItemsView</code>
|<code>MappingView</code>،<code>Set</code>
|<code>__contains__</code>، <code>__iter__</code>
|-
|<code>KeysView</code>
|<code>MappingView</code>،<code>Set</code>
|<code>__contains__</code>، <code>__iter__</code>
|-
|<code>ValuesView</code>
|<code>MappingView</code>،<code>Collection</code>
|<code>__contains__</code>، <code>__iter__</code>
|-
|<code>Awaitable</code>
|<code>__await__</code>
|-
|<code>Coroutine</code>
|<code>Awaitable</code>
|<code>send</code>، <code>throw</code>
|<code>close</code>
|-
|<code>AsyncIterable</code>
|<code>__aiter__</code>
|-
|<code>AsyncIterator</code>
|<code>AsyncIterable</code>
|<code>__anext__</code>
|<code>__aiter__</code>
|-
|<code>AsyncGenerator</code>
|<code>AsyncIterator</code>
|<code>asend</code>، <code>athrow</code>
|<code>aclose</code>، <code>__aiter__</code>، <code>__anext__‎</code>
|}


class collections.abc.Iterable
=== الصنف <code>collections.abc.Container</code> ===
صنف أساسي مجرّد للأصناف التي تقدّم التابع ‎__iter__()‎.


تؤدي عملية التحقّق بواسطة الدالة isinstance(obj, iterable)‎ إلى الكشف عن الأصناف المسجّلة على أنّها صنف Iterable الأساسي المجرّد أو أنّها تمتلك التابع ‎__iter__()‎، ولكنّها لا تكتشف الأاصناف التي تجري عملية التكرار بواسطة التابع ‎__getitem__()‎. الطريقة الوحيدة لتحديد ما إذا كان الكائن قابلًا للتكرار هي استدعاء الدالة iter(obj)‎.
=== الصنف <code>collections.abc.Hashable</code> ===


=== الصنف <code>collections.abc.Sized</code> ===


class collections.abc.Collection
====== الصنف <code>collections.abc.Callable</code> ======
صنف أساسي مجرّد لأصناف الحاويات التكرارية المحجّمة.
أصناف أساسية مجرّدة للأصناف التي تقدّم التوابع ‎<code>__contains__()</code>‎، ‎<code>__hash__()</code>‎، ‎<code>__len__()‎</code> و ‎<code>__call__()‎</code> على التوالي.
ملاحظة: هذا الصنف جديد في الإصدار 3.6 من بايثون.


class collections.abc.Iterator
=== الصنف <code>collections.abc.Iterable</code> ===
صنف أساسي مجرّد للأصناف التي تقدّم التابعين ‎__iter__()و __next__()‎.  
صنف أساسي مجرّد للأصناف التي تقدّم التابع <code>__iter__()‎</code>.


class collections.abc.Reversible
تؤدي عملية التحقّق بواسطة الدالة <code>[[Python/isinstance|isinstance(obj، iterable)]]‎</code> إلى الكشف عن الأصناف المسجّلة على أنّها صنف <code>Iterable</code> الأساسي المجرّد أو أنّها تمتلك التابع <code>‎__iter__()</code>‎، ولكنّها لا تكتشف الأصناف التي تجري عملية التكرار بواسطة التابع <code>‎__getitem__()‎</code>. الطريقة الوحيدة لتحديد ما إذا كان الكائن قابلًا للتكرار هي استدعاء الدالة <code>iter(obj)</code>‎.
صنف أساسي مجرّد للأصناف التكرارية التي تقدّم التابع ‎__reversed__()‎.
ملاحظة: هذا الصنف جديد في الإصدار 3.6 من بايثون.


class collections.abc.Generator
=== الصنف <code>collections.abc.Collection</code> ===
صنف أساسي مجرّد لإنشاء أصناف تستخدم البروتوكول المعرّف في PEP 342 والذي يضيف التوابع send()‎ و throw()‎ و close()‎ إلى المكرِّرات.
صنف أساسي مجرّد لأصناف الحاويات التكرارية المحجّمة (sized iterable container classes).
 
'''ملاحظة:''' هذا الصنف جديد في الإصدار 3.6 من بايثون.
 
=== الصنف <code>collections.abc.Iterator</code> ===
صنف أساسي مجرّد للأصناف التي تقدّم التابعين ‎<code>__iter__()</code>‎ و ‎<code>__next__()‎‎</code>.
 
=== الصنف <code>collections.abc.Reversible</code> ===
صنف أساسي مجرّد للأصناف التكرارية التي تقدّم التابع ‎<code>__reversed__()‎</code>.
 
'''ملاحظة:''' هذا الصنف جديد في الإصدار 3.6 من بايثون.
 
=== الصنف <code>collections.abc.Generator</code> ===
صنف أساسي مجرّد لإنشاء أصناف تستخدم البروتوكول المعرّف في PEP 342 والذي يضيف التوابع <code>send()‎</code> و <code>throw()</code>‎ و <code>close()</code>‎ إلى المكرِّرات.


ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.
ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.


class collections.abc.Sequence
=== الصنف <code>collections.abc.Sequence</code> ===
class collections.abc.MutableSequence
 
class collections.abc.ByteString
=== الصنف <code>collections.abc.MutableSequence</code> ===
صنف أساسي مجرّد للتسلسلات التي تكون قابلة للتعديل mutable وللقراءة فقط read-only.
 
=== الصنف <code>collections.abc.ByteString</code> ===
أصناف أساسية مجرّدة للتسلسلات التي تكون قابلة للتعديل mutable وللقراءة فقط read-only.
 
'''ملاحظة:''' بعض توابع mixin مثل <code>‎__iter__()</code>‎ و <code>‎__reversed__()</code>‎ و <code>index()</code>‎ تجري استدعاءات متكرّرة للتابع الضمني ‎<code>__getitem__()‎</code>. ونتيجة لذلك، إن كان التابع ‎<code>__getitem__()</code>‎ مُستخدمًا بسرعة وصول ثابتة، فإنّ أداء توابع mixin سيكون خطّيًا، ولكن إن كان التابع الضمني خطّيًا (كما هو الحال مع قائمة مرتبطة) فإنّ أداء توابع mixin سيكون تربيعيًا وهنا تظهر الحاجة إلى إعادة تعريفها.
 
'''ملاحظة:''' في الإصدار 3.5 أضيف المعاملان <code>stop</code> و <code>start</code> إلى التابع <code>index()‎</code>.


ملاحظة: بعض توابع mixin مثل ‎__iter__()‎ و ‎__reversed__()‎ و index()‎ تجري استدعاءات متكرّرة للتابع الضمني ‎__getitem__()‎. ونتيجة لذلك، إن كان التابع ‎__getitem__()‎ مُستخدمًا بسرعة وصول ثابتة، فإنّ أداء توابع mixin سيكون خطّيًا، ولكن إن كان التابع الضمني خطّيًا (كما هو الحال مع قائمة مرتبطة) فإنّ أداء توابع mixin سيكون تربيعيًا وهنا تظهر الحاجة إلى إعادة تعريفها.
=== الصنف <code>collections.abc.Set</code> ===
ملاحظة: في الإصدار 3.5 أضيف المعاملان stop و start إلى التابع index()‎.


class collections.abc.Set
=== الصنف <code>collections.abc.MutableSet</code> ===
class collections.abc.MutableSet
صنف أساسي مجرّد للمجموعات القابلة للتعديل والتي تكون للقراءة فقط.
صنف أساسي مجرّد للمجموعات القابلة للتعديل والتي تكون للقراءة فقط.


class collections.abc.Mapping
=== الصنف <code>collections.abc.Mapping</code> ===
class collections.abc.MutableMapping
 
=== الصنف  <code>collections.abc.MutableMapping</code> ===
صنف أساسي مجرّد للمجموعات لكائنات الربط القابلة للتعديل والتي تكون للقراءة فقط.
صنف أساسي مجرّد للمجموعات لكائنات الربط القابلة للتعديل والتي تكون للقراءة فقط.


class collections.abc.MappingView
=== الصنف <code>collections.abc.MappingView</code> ===
class collections.abc.ItemsView
 
class collections.abc.KeysView
=== الصنف  <code>collections.abc.ItemsView</code> ===
class collections.abc.ValuesView
 
=== الصنف  <code>collections.abc.KeysView</code> ===
 
=== الصنف  <code>collections.abc.ValuesView</code> ===
أصناف أساسية مجرّد لعروض كائنات الربط والعناصر items والمفاتيح keys والقيم values.
أصناف أساسية مجرّد لعروض كائنات الربط والعناصر items والمفاتيح keys والقيم values.


class collections.abc.Awaitable
=== الصنف <code>collections.abc.Awaitable</code> ===
صنف أساسي مجرّد لكائنات awaitable، والتي يمكن استخدامها في تعابير await. يجب أن يقدّم الاستخدام المخصّص لهذا الصنف التابع ‎__await__‎()‎.
صنف أساسي مجرّد لكائنات <code>awaitable</code>، والتي يمكن استخدامها في تعابير <code>await</code>. يجب أن يقدّم الاستخدام المخصّص لهذا الصنف التابع <code>‎__await__‎()</code>‎.
كائنات Coroutine و نسخ الصنف الأساسي المجرّد Couroutine هي كلّها نسخ من هذا الصنف الأساسي المجرّد.
 
كائنات <code>Coroutine</code> و نسخ الصنف الأساسي المجرّد <code>Couroutine</code> هي كلّها نسخ من هذا الصنف الأساسي المجرّد.


ملاحظة:
ملاحظة:
تكون الـ coroutines المستندة على المولدات في CPython (المولّدات المزخرفة بواسطة التابع types.coroutine()‎ أو asyncio.coroutine()‎) من نوع awaitable على الرغم من عدم احتوائها على التابع ‎__await__()‎. تعيد الدالة isinstance(gencoro, Awaitable)‎ القيمة False، ويجب استخدام التابع Useinspect.isawaitable()‎ للكشف عنها.
 
تكون الـ coroutines المستندة على المولدات في CPython (المولّدات المزخرفة بواسطة التابع <code>types.coroutine()‎</code> أو <code>asyncio.coroutine()</code>‎) من نوع <code>awaitable</code> على الرغم من عدم احتوائها على التابع ‎<code>__await__()</code>‎. تعيد الدالة <code>[[Python/isinstance|isinstance(gencoro، Awaitable)]]</code>‎ القيمة <code>False</code>، ويجب استخدام التابع <code>Useinspect.isawaitable()‎</code> للكشف عنها.


ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.
ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.


class collections.abc.Coroutine
=== الصنف <code>collections.abc.Coroutine</code> ===
صنف أساسي مجرّد للأصناف المتوافقة مع الـ coroutine. تستخدم هذه الأصناف التوابع <code>send()‎</code> و <code>throw()‎</code> و <code>close()‎</code> والمعرّفة في كائنات <code>Coroutine</code>. إلى جانب ذلك يجب أن يتضمّن الاستخدام المخصّص لهذا الصنف الأساسي المجرد تضمين التابع ‎<code>__await__()</code>‎. جميع نسخ الصنف <code>Coroutine</code> هي نسخ للصنف <code>Awaitable</code> أيضًا.


صنف أساسي مجرّد للأصناف المتوافقة مع الـ coroutine. تستخدم هذه الأصناف التوابع send()‎ و throw()‎ و close()‎ والمعرّفة في كائنات Coroutine. إلى جانب ذلك يجب أن يتضمّن الاستخدام المخصّص لهذا الصنف الأساسي المجرد تضمين التابع ‎__await__()‎. جميع نسخ الصنف Coroutine هي نسخ للصنف Awaitable أيضًا.
'''ملاحظة:'''


ملاحظة:
تكون الـ coroutines المستندة على المولدات في CPython (المولّدات المزخرفة بواسطة التابع <code>types.coroutine()</code>‎ أو <code>asyncio.coroutine()</code>‎) من نوع <code>awaitable</code> على الرغم من عدم احتوائها على التابع <code>‎__await__()‎</code>. تعيد الدالة <code>[[Python/isinstance|isinstance(gencoro، Coroutine)‎]]</code> القيمة <code>False</code>، ويجب استخدام التابع <code>Useinspect.isawaitable()‎</code> للكشف عنها.
تكون الـ coroutines المستندة على المولدات في CPython (المولّدات المزخرفة بواسطة التابع types.coroutine()‎ أو asyncio.coroutine()‎) من نوع awaitable على الرغم من عدم احتوائها على التابع ‎__await__()‎. تعيد الدالة isinstance(gencoro, Coroutine)‎ القيمة False، ويجب استخدام التابع Useinspect.isawaitable()‎ للكشف عنها.


ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.
ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.


class collections.abc.AsyncIterable
=== الصنف  <code>collections.abc.AsyncIterable</code> ===
صنف أساسي مجرّد للأصناف التي تقدّم التابع ‎__aiter__‎.  
صنف أساسي مجرّد للأصناف التي تقدّم التابع ‎<code>__aiter__</code>‎.  
ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.
 
'''ملاحظة:''' هذا الصنف جديد في الإصدار 3.5 من بايثون.
 
=== الصنف  <code>collections.abc.AsyncIterator</code> ===
صنف أساسي مجرّد للأصناف التي تقدّم التابعين <code>‎__aiter__‎</code> و <code>‎__anext__‎</code>.


class collections.abc.AsyncIterator
'''ملاحظة:''' هذا الصنف جديد في الإصدار 3.5 من بايثون.
صنف أساسي مجرّد للأصناف التي تقدّم التابعين ‎__aiter__‎ و ‎__anext__‎.
ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.


class collections.abc.AsyncGenerator
=== الصنف <code>collections.abc.AsyncGenerator</code> ===
صنف أساسي مجرّد للأصناف المولّدة غير المتزامنة asynchronous generator classes والتي تعتمد البروتوكول المعرف في PEP 525 و PEP 492.
صنف أساسي مجرّد للأصناف المولّدة غير المتزامنة asynchronous generator classes والتي تعتمد البروتوكول المعرف في PEP 525 و PEP 492.


ملاحظة: هذا الصنف جديد في الإصدار 3.6 من بايثون.
'''ملاحظة:''' هذا الصنف جديد في الإصدار 3.6 من بايثون.
 
تتيح هذه الأصناف الأساسية المجرّد معرفةما إذا كانت الأصناف أو النسخ تقدّم وظيفة معيّنة، فعلى سبيل المثال:


تتيح هذه الأصناف الأساسية المجرّد معرفةما إذا كانت الأصناف أو النسخ تقدّم وظيفة معيّنة، فعلى سبيل المثال:<syntaxhighlight lang="python3">
size = None
size = None
if isinstance(myvar, collections.abc.Sized):
if isinstance(myvar, collections.abc.Sized):
     size = len(myvar)
     size = len(myvar)
</syntaxhighlight>هناك عدد من الأصناف الأساسية المجرّدة التي يمكن الاستفادة منها كـ mixin تسهّل عملية تطوير أصناف تدعم الواجهات البرمجية الخاصة بالصنف الحاوي.


هناك عدد من الأصناف الأساسية المجرّدة التي يمكن الاستفادة منها كـ mixin تسهّل عملية تطوير أصناف تدعم الواجهات البرمجية الخاصة بالصنف الحاوي.
فمثلًا، لكتابة صنف يدعم الواجهة البرمجية الكامل للصنف الأساسي المجرد <code>Set</code>، يكفي تزويد الصنف بالتوابع الضمنية المجرّدة التالية: <code>‎__contains__()</code>‎ و <code>‎__iter__()</code>‎ و <code>‎__len__()</code>‎، ويزوّد الصنف الأساسي المجرد بقية التوابع مثل <code>‎‎__and__‎()‎</code> و <code>isdisjoint()</code>‎:<syntaxhighlight lang="python3">
 
فمثلًا، لكتابة صنف يدعم الواجهة البرمجية الكامل للصنف الأساسي المجرد Set، يكفي تزويد الصنف بالتوابع الضمنية المجرّدة التالية: ‎__contains__()‎ و ‎__iter__()‎ و ‎__len__()‎، ويزوّد الصنف الأساسي المجرد بقية التوابع مثل ‎‎__and__‎()‎ و isdisjoint()‎:
 
class ListBasedSet(collections.abc.Set):
class ListBasedSet(collections.abc.Set):
     ''' Alternate set implementation favoring space over speed
     ''' Alternate set implementation favoring space over speed
سطر 120: سطر 267:
overlap = s1 & s2            # مدعوم تلقائيًا ‎__and__()‎ التابع
overlap = s1 & s2            # مدعوم تلقائيًا ‎__and__()‎ التابع


ملاحظات على استخدام Set و MutableSet كـ mixin:


1- لمّا كانت بعض عمليات المجموعات تنشئ مجموعات جديدة فإنّ توابع mixin الافتراضية تكون بحاجة إلى غنشاء نسخ جديدة من المكرِّر. ويُفترض أن تتضمّن الدالة البانية للصنف توقيعًا بالصيغة form ClassName(iterable)‎.  
</syntaxhighlight>
 
=== ملاحظات على استخدام <code>Set</code> و <code>MutableSet</code> كـ mixin: ===
# لمّا كانت بعض عمليات المجموعات تنشئ مجموعات جديدة فإنّ توابع mixin الافتراضية تكون بحاجة إلى إنشاء نسخ جديدة من المكرِّر. ويُفترض أن تتضمّن الدالة البانية للصنف توقيعًا بالصيغة<code>ClassName(iterable)‎</code>.  يجري تحليل ذلك الافتراض إلى تابع صنف داخلي يدعى ‎<code>_from_iterable()‎</code> والذي يستدعي الدالة <code>cls(iterable)‎</code> لإنشاء مجموعة جديدة. إن استخدم Set mixin في صنف ذي توقع مختلف في دالته البانية، فيجب إعادة تعريف override التابع <code>‎_from_iterable()</code>‎ بتابع صنف يمكنه بناء نسخ جديد من معامل مكرِّر iterable argument.
# لإعادة تعريف عمليات المقارنة (لأغراض السرعة على الأرجح وذلك لأنّها عمليات ثابتة) يجب إعادة تعريف التابعين <code>‎__le__‎()‎</code> و <code>‎__ge__()</code>‎ وستتبع بقية العمليات هذين التابعين بصورة تلقائية.
# يقدّم Set mixin تابع <code>‎_hash()</code>‎ لحساب قيمة <code>hash</code> للمجموعة، ولكن لا يجري تعريف التابع <code>‎__hash__()</code>‎ لأنّ جميع [[Python/set|المجموعات]] تكون قابلة للتقطيع hashable أو غير قابلة للتعديل immutable. ولإضافة قابلية التقطيع باستخدام mixins، يمكن الوراثة من الصنفين <code>Set()</code>‎ و <code>Hashable()</code>‎ ثم تعريف القيمة <code>‎__hash__ ‎ = Set._hash</code>.
 
== انظر أيضًا ==
 
* [[Python/collections|وحدة <code>collections</code> في بايثون]].
 
== مصادر ==


يجري تحليل ذلك الافتراض إلى تابع صنف داخلي يدعى ‎_from_iterable()‎ والذي يستدعي الدالة cls(iterable)‎ لإنشاء مجموعة جديدة. إن استخدم Set mixin في صنف ذي توقع مختلف في دالته البانية، فيجب إعادة تعريف override التابع ‎_from_iterable()‎ بتابع صنف يمكنه بناء نسخ جديد من معامل مكرِّر iterable argument.
* [https://docs.python.org/3/library/collections.abc.html صفحة Abstract Base Classes for Containers في توثيق بايثون الرسمي.]


2- لإعادة تعريف عمليات المقارنة (لأغراض السرعة على الأرجح وذلك لأنّها عمليات ثابتة) يجب إعادة تعريف التابعين ‎__le__‎()‎ و ‎__ge__()‎ وستتبع بقية العمليات هذين التابعين بصورة تلقائية.
[[تصنيف:Python]]
3- يقدّم Set mixin تابع ‎_hash()‎ لحساب قيمة hash للمجموعة، ولكن لا يجري تعريف التابع ‎__hash__()‎ لأنّ جميع المجموعات تكون قابلة للتقطيع hashable أو غير قابلة للتعديل immutable. ولإضافة قابلية التقطيع باستخدام mixins، يمكن الوراثة من الصنفين Set()‎ و Hashable()‎ ثم تعريف القيمة ‎__hash__ ‎ = Set._hash.
[[تصنيف:Python Modules]]

المراجعة الحالية بتاريخ 14:43، 31 يوليو 2018

تقدّم هذه الوحدة مجموعة من الأصناف الأساسية المجرّدة abstract base calsses (يرمز لها ABC اختصارًا) والتي يمكن استخدامها للتأكد ممّا إذا كان صنف معيّن يقدّم واجهة interface معينة، كأن يكون الصنف قابلًا للتقطيع hashable أو أنّه صنف ربط mapping.

ملاحظة: قبل الإصدار 3.3 من اللغة كانت هذه الوحدة جزءًا من وحدة collections.

الأصناف الأساسية المجرّدة في الوحدة collections

تقدّم وحدة collections الأصناف الأساسية المجرّدة التالية:

الصنف الأساسي المجرد يرث من التوابع المجرّدة توابع mixin
Container   __contains__  
Hashable   __hash__  
Iterable   __iter__  
Iterator Iterable __next__ __iter__
Reversible Iterable __reversed__  
Generator Iterator send، throw close، __iter__، __next__‎
Sized   __len__  
Callable   __call__  
Collection Sized،Iterable،Container ‎__‎contains__‎ ‎‎، ‎‎__iter__‎‎ ، ‎__len__‎‎‎‎  
Sequence Reversible،Collection __getitem__، __len__ __contains__ ، __iter__ ،  __reversed__ ، index ، count
MutableSequence Sequence __getitem__ ‎،__setitem__، __delitem__، __len__،  insert توابع Sequence الموروثة

و append، reverse، extend، pop، remove، و __iadd__

ByteString Sequence __getitem__، __len__ توابع Sequence الموروثة
Set Collection __contains__ ، __iter__ ،__len __‎ ‎__le__‎, ‎__lt__‎, ‎__eq__‎, ‎__ne__‎,‎__gt__‎, ‎__ge__‎, ‎__and__‎, ‎__or__‎,‎__sub__‎, ‎__xor__‎, isdisjoint
MutableSet Set __contains__ ، __iter__ ،__len__، add،discard توابع Sequence الموروثة إضافة إلى التوابع

clear، pop، remove، __ior__ ، __iand__ ،‎ __ixor‎__ ،  __isub__‎

Mapping Collection __getitem__ ،__iter__،__len__‎ ‎‎__contains__ ،  keys ،  items ، values ، get،  ‎__eq__‎‎ ، و ‎__ne__‎
MutableMapping Mapping __getitem__، __setitem__ ،__delitem__ ،__iter__ ،__len__‎ توابع Mapping الموروثة و pop، popitem، clear، update، و setdefault
MappingView Sized   __len__
ItemsView MappingView،Set   __contains__، __iter__
KeysView MappingView،Set   __contains__، __iter__
ValuesView MappingView،Collection   __contains__، __iter__
Awaitable   __await__  
Coroutine Awaitable send، throw close
AsyncIterable   __aiter__  
AsyncIterator AsyncIterable __anext__ __aiter__
AsyncGenerator AsyncIterator asend، athrow aclose، __aiter__، __anext__‎

الصنف collections.abc.Container

الصنف collections.abc.Hashable

الصنف collections.abc.Sized

الصنف collections.abc.Callable

أصناف أساسية مجرّدة للأصناف التي تقدّم التوابع ‎__contains__()‎، ‎__hash__()‎، ‎__len__()‎ و ‎__call__()‎ على التوالي.

الصنف collections.abc.Iterable

صنف أساسي مجرّد للأصناف التي تقدّم التابع ‎__iter__()‎.

تؤدي عملية التحقّق بواسطة الدالة isinstance(obj، iterable) إلى الكشف عن الأصناف المسجّلة على أنّها صنف Iterable الأساسي المجرّد أو أنّها تمتلك التابع ‎__iter__()‎، ولكنّها لا تكتشف الأصناف التي تجري عملية التكرار بواسطة التابع ‎__getitem__()‎. الطريقة الوحيدة لتحديد ما إذا كان الكائن قابلًا للتكرار هي استدعاء الدالة iter(obj)‎.

الصنف collections.abc.Collection

صنف أساسي مجرّد لأصناف الحاويات التكرارية المحجّمة (sized iterable container classes).

ملاحظة: هذا الصنف جديد في الإصدار 3.6 من بايثون.

الصنف collections.abc.Iterator

صنف أساسي مجرّد للأصناف التي تقدّم التابعين ‎__iter__()‎ و ‎__next__()‎‎.

الصنف collections.abc.Reversible

صنف أساسي مجرّد للأصناف التكرارية التي تقدّم التابع ‎__reversed__()‎.

ملاحظة: هذا الصنف جديد في الإصدار 3.6 من بايثون.

الصنف collections.abc.Generator

صنف أساسي مجرّد لإنشاء أصناف تستخدم البروتوكول المعرّف في PEP 342 والذي يضيف التوابع send()‎ و throw()‎ و close()‎ إلى المكرِّرات.

ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.

الصنف collections.abc.Sequence

الصنف collections.abc.MutableSequence

الصنف collections.abc.ByteString

أصناف أساسية مجرّدة للتسلسلات التي تكون قابلة للتعديل mutable وللقراءة فقط read-only.

ملاحظة: بعض توابع mixin مثل ‎__iter__()‎ و ‎__reversed__()‎ و index()‎ تجري استدعاءات متكرّرة للتابع الضمني ‎__getitem__()‎. ونتيجة لذلك، إن كان التابع ‎__getitem__()‎ مُستخدمًا بسرعة وصول ثابتة، فإنّ أداء توابع mixin سيكون خطّيًا، ولكن إن كان التابع الضمني خطّيًا (كما هو الحال مع قائمة مرتبطة) فإنّ أداء توابع mixin سيكون تربيعيًا وهنا تظهر الحاجة إلى إعادة تعريفها.

ملاحظة: في الإصدار 3.5 أضيف المعاملان stop و start إلى التابع index()‎.

الصنف collections.abc.Set

الصنف collections.abc.MutableSet

صنف أساسي مجرّد للمجموعات القابلة للتعديل والتي تكون للقراءة فقط.

الصنف collections.abc.Mapping

الصنف collections.abc.MutableMapping

صنف أساسي مجرّد للمجموعات لكائنات الربط القابلة للتعديل والتي تكون للقراءة فقط.

الصنف collections.abc.MappingView

الصنف collections.abc.ItemsView

الصنف collections.abc.KeysView

الصنف collections.abc.ValuesView

أصناف أساسية مجرّد لعروض كائنات الربط والعناصر items والمفاتيح keys والقيم values.

الصنف collections.abc.Awaitable

صنف أساسي مجرّد لكائنات awaitable، والتي يمكن استخدامها في تعابير await. يجب أن يقدّم الاستخدام المخصّص لهذا الصنف التابع ‎__await__‎()‎.

كائنات Coroutine و نسخ الصنف الأساسي المجرّد Couroutine هي كلّها نسخ من هذا الصنف الأساسي المجرّد.

ملاحظة:

تكون الـ coroutines المستندة على المولدات في CPython (المولّدات المزخرفة بواسطة التابع types.coroutine()‎ أو asyncio.coroutine()‎) من نوع awaitable على الرغم من عدم احتوائها على التابع ‎__await__()‎. تعيد الدالة isinstance(gencoro، Awaitable)‎ القيمة False، ويجب استخدام التابع Useinspect.isawaitable()‎ للكشف عنها.

ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.

الصنف collections.abc.Coroutine

صنف أساسي مجرّد للأصناف المتوافقة مع الـ coroutine. تستخدم هذه الأصناف التوابع send()‎ و throw()‎ و close()‎ والمعرّفة في كائنات Coroutine. إلى جانب ذلك يجب أن يتضمّن الاستخدام المخصّص لهذا الصنف الأساسي المجرد تضمين التابع ‎__await__()‎. جميع نسخ الصنف Coroutine هي نسخ للصنف Awaitable أيضًا.

ملاحظة:

تكون الـ coroutines المستندة على المولدات في CPython (المولّدات المزخرفة بواسطة التابع types.coroutine()‎ أو asyncio.coroutine()‎) من نوع awaitable على الرغم من عدم احتوائها على التابع ‎__await__()‎. تعيد الدالة isinstance(gencoro، Coroutine)‎ القيمة False، ويجب استخدام التابع Useinspect.isawaitable()‎ للكشف عنها.

ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.

الصنف collections.abc.AsyncIterable

صنف أساسي مجرّد للأصناف التي تقدّم التابع ‎__aiter__‎.

ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.

الصنف collections.abc.AsyncIterator

صنف أساسي مجرّد للأصناف التي تقدّم التابعين ‎__aiter__‎ و ‎__anext__‎.

ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.

الصنف collections.abc.AsyncGenerator

صنف أساسي مجرّد للأصناف المولّدة غير المتزامنة asynchronous generator classes والتي تعتمد البروتوكول المعرف في PEP 525 و PEP 492.

ملاحظة: هذا الصنف جديد في الإصدار 3.6 من بايثون.

تتيح هذه الأصناف الأساسية المجرّد معرفةما إذا كانت الأصناف أو النسخ تقدّم وظيفة معيّنة، فعلى سبيل المثال:

size = None
if isinstance(myvar, collections.abc.Sized):
    size = len(myvar)

هناك عدد من الأصناف الأساسية المجرّدة التي يمكن الاستفادة منها كـ mixin تسهّل عملية تطوير أصناف تدعم الواجهات البرمجية الخاصة بالصنف الحاوي. فمثلًا، لكتابة صنف يدعم الواجهة البرمجية الكامل للصنف الأساسي المجرد Set، يكفي تزويد الصنف بالتوابع الضمنية المجرّدة التالية: ‎__contains__()‎ و ‎__iter__()‎ و ‎__len__()‎، ويزوّد الصنف الأساسي المجرد بقية التوابع مثل ‎‎__and__‎()‎ و isdisjoint()‎:

class ListBasedSet(collections.abc.Set):
    ''' Alternate set implementation favoring space over speed
        and not requiring the set elements to be hashable. '''
    def __init__(self, iterable):
        self.elements = lst = []
        for value in iterable:
            if value not in lst:
                lst.append(value)

    def __iter__(self):
        return iter(self.elements)

    def __contains__(self, value):
        return value in self.elements

    def __len__(self):
        return len(self.elements)

s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2            # مدعوم تلقائيًا ‎__and__()‎ التابع

ملاحظات على استخدام Set و MutableSet كـ mixin:

  1. لمّا كانت بعض عمليات المجموعات تنشئ مجموعات جديدة فإنّ توابع mixin الافتراضية تكون بحاجة إلى إنشاء نسخ جديدة من المكرِّر. ويُفترض أن تتضمّن الدالة البانية للصنف توقيعًا بالصيغةClassName(iterable)‎. يجري تحليل ذلك الافتراض إلى تابع صنف داخلي يدعى ‎_from_iterable()‎ والذي يستدعي الدالة cls(iterable)‎ لإنشاء مجموعة جديدة. إن استخدم Set mixin في صنف ذي توقع مختلف في دالته البانية، فيجب إعادة تعريف override التابع ‎_from_iterable()‎ بتابع صنف يمكنه بناء نسخ جديد من معامل مكرِّر iterable argument.
  2. لإعادة تعريف عمليات المقارنة (لأغراض السرعة على الأرجح وذلك لأنّها عمليات ثابتة) يجب إعادة تعريف التابعين ‎__le__‎()‎ و ‎__ge__()‎ وستتبع بقية العمليات هذين التابعين بصورة تلقائية.
  3. يقدّم Set mixin تابع ‎_hash()‎ لحساب قيمة hash للمجموعة، ولكن لا يجري تعريف التابع ‎__hash__()‎ لأنّ جميع المجموعات تكون قابلة للتقطيع hashable أو غير قابلة للتعديل immutable. ولإضافة قابلية التقطيع باستخدام mixins، يمكن الوراثة من الصنفين Set()‎ و Hashable()‎ ثم تعريف القيمة ‎__hash__ ‎ = Set._hash.

انظر أيضًا

مصادر