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

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:الوحدة <code>weakref‎</code> في بايثون}}</noinclude> تتيح وحدة wekref إنشاء إشارات ضعيفة weak referenc...'
 
لا ملخص تعديل
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الوحدة <code>weakref‎</code> في بايثون}}</noinclude>
<noinclude>{{DISPLAYTITLE:الوحدة <code>weakref‎</code> في بايثون}}</noinclude>


تتيح وحدة wekref إنشاء إشارات ضعيفة weak references للكائنات.
تتيح وحدة <code>wekref</code> إنشاء إشارات ضعيفة weak references للكائنات.


سنستخدم مصطلح الكائن المشار إليه للتعبير عن الكائن الذي يُشار إليه بإشارة ضعيفة.
سنستخدم مصطلح الكائن المشار إليه للتعبير عن الكائن الذي يُشار إليه بإشارة ضعيفة.
سطر 11: سطر 11:
فعلى سبيل المثال، إن كان لديك عدد من كائنات ملفات ثنائية لصور كبيرة الحجم، فقد ترغب في إعطاء اسم خاص لكل كائن. إن استخدمت قاموس بايثون لربط الأسماء بالصور أو الصور بالأسماء، فإنّ كائنات الصور ستبقى حيّة لسبب واحد فقط، وهو أنّها ظهرت كقيم أو مفاتيح في القواميس.
فعلى سبيل المثال، إن كان لديك عدد من كائنات ملفات ثنائية لصور كبيرة الحجم، فقد ترغب في إعطاء اسم خاص لكل كائن. إن استخدمت قاموس بايثون لربط الأسماء بالصور أو الصور بالأسماء، فإنّ كائنات الصور ستبقى حيّة لسبب واحد فقط، وهو أنّها ظهرت كقيم أو مفاتيح في القواميس.


تقدّم وحدة weakref الصنفين TheWeakKeyDictionary و WeakValueDictionary كحل بديل، حيث تُستخدم الإشارات الضعيفة لبناء روابط لا تبقى على الكائنات لمجرّد ظهورها في كائنات الربط.  
تقدّم وحدة <code>weakref</code> الصنفين <code>WeakKeyDictionary</code> و <code>WeakValueDictionary</code> كحل بديل، حيث تُستخدم الإشارات الضعيفة لبناء روابط لا تبقى على الكائنات لمجرّد ظهورها في كائنات الربط.  


إن كان كائن صورة يمثّل قيمة في WeakValueDictionary ولا يتبقّى من الإشارات إلى هذا الكائن سوى الإشارات الضعيفة الموجودة في كائنات الربط الضعيفة، فسيكون حينئذٍ بمقدور مجموعة garbage أن تستعيد الكائن، وسيُحذف من كائنات الربط الضعيفة كلّها.
إن كان كائن صورة يمثّل قيمة في <code>WeakValueDictionary</code> ولا يتبقّى من الإشارات إلى هذا الكائن سوى الإشارات الضعيفة الموجودة في كائنات الربط الضعيفة، فسيكون حينئذٍ بمقدور مجموعة garbage أن تستعيد الكائن، وسيُحذف من كائنات الربط الضعيفة كلّها.


تستخدم WeakKeyDictionary و WeakValueDictionary الإشارات الضعيفة في عملها، حيث يجري إعداد دوال استدعاء خلفي على الإشارات الضعيفة والتي تنبه القواميس الضعيفة عندما تسترجع مجموعة garbage مفتاحًا أو قيمة من القاموس.
تستخدم <code>WeakKeyDictionary</code> و <code>WeakValueDictionary</code> الإشارات الضعيفة في عملها، حيث يجري إعداد دوال استدعاء خلفي على الإشارات الضعيفة والتي تنبه القواميس الضعيفة عندما تسترجع مجموعة garbage مفتاحًا أو قيمة من القاموس.


تتعامل WeakSet مع المجموعات، ولكنّها تبقي على الإشارات الضعيفة إلى عناصرها، كما هو الحال مع WeakKeyDictionary.
تتعامل <code>WeakSet</code> مع المجموعات، ولكنّها تبقي على الإشارات الضعيفة إلى عناصرها، كما هو الحال مع <code>WeakKeyDictionary</code>.


تقدم finalize طريقة مباشرة لتسجيل دوال التنظيف وذلك لاستدعائها عند استرجاع الكائن بواسطة مجموعة garbage، وهذه الطريقة أبسط من إعداد دالة استدعاء خلفي على إشارة ضعيفة، لأنّ الوحدة ستضمن على نحو تلقائي أنّ دالة الإنهاء finalizer ستبقى حيّة إلى حين جمع الكائن بواسطة مجموعة garbage.
تقدم <code>finalize</code> طريقة مباشرة لتسجيل دوال التنظيف وذلك لاستدعائها عند استرجاع الكائن بواسطة مجموعة garbage، وهذه الطريقة أبسط من إعداد دالة استدعاء خلفي على إشارة ضعيفة، لأنّ الوحدة ستضمن على نحو تلقائي أنّ دالة الإنهاء <code>finalizer</code> ستبقى حيّة إلى حين جمع الكائن بواسطة مجموعة garbage.


يمكن لأنواع الحاويات الضعيفة أو التابع finalize أن تسد احتياجات معظم البرامج، وعادة ما لا تكون هناك حاجة إلى إنشاء إشارات ضعيفة خاصة. تقدّم وحدة weakref آلية عمل المستوى الواطئ low-level وذلك  
يمكن لأنواع الحاويات الضعيفة أو التابع <code>finalize</code> أن تسد احتياجات معظم البرامج، وعادة ما لا تكون هناك حاجة إلى إنشاء إشارات ضعيفة خاصة. تتيح وحدة <code>weakref</code> التعامل مع المستوى الواطئ low-level وذلك لإنجاز مهام متقدّمة ومعقدة.
The low-level machinery is exposed by the weakref module for the benefit of advanced uses.


لا يمكن إنشاء إشارة ضعيفة لجميع الكائنات، ولكن يمكن إنشاء مثل هذه الإشارة لنسخ الأصناف، والدوال المكتوبة في بايثون (وليست مكتوبة في C)، وتوابع النسخ، والمجموعات، والمجموعات المجمّدة، وبعض كائنات الملفات، والمولّدات، وكائنات النوع، والمنافذ sockets، والمصفوفات، وكائنات deque، وكائنات أنماط التعابير النمطية، وكائنات code.
لا يمكن إنشاء إشارة ضعيفة لجميع الكائنات، ولكن يمكن إنشاء مثل هذه الإشارة [[Python/class|لنسخ الأصناف]]، و<nowiki/>[[Python/functions|الدوال]] المكتوبة في بايثون (وليست مكتوبة في C)، و<nowiki/>[[Python/classmethod|توابع النسخ]]، [[Python/set|والمجموعات]]، و<nowiki/>[[Python/frozenset|المجموعات المجمّدة]]، وبعض كائنات الملفات، [[Python/generators|والمولّدات]]، و<nowiki/>[[Python/type|كائنات النوع]]، والمنافذ sockets، [[Python/array|والمصفوفات]]، [[Python/deque|وكائنات <code>deque</code>]]، و<nowiki/>[[Python/regex|كائنات أنماط التعابير النمطية]]، و<nowiki/>[[Python/code|كائنات code]].


ملاحظة: أصبح بالإمكان إنشاء إشارات ضعيفة لكل من thread.lock و threading.Lock وكائنات code في الإصدار 3.2 من اللغة.
ملاحظة: أصبح بالإمكان إنشاء إشارات ضعيفة لكل من <code>thread.lock</code> و <code>threading.Lock</code> وكائنات code في الإصدار 3.2 من اللغة.
 
لا تدعم العديد من أنواع البيانات الداخلية -مثل القوائم والقواميس- الإشارات الضعيفة على نحو مباشر، ولكن يمكن ذلك عن طريق التفريع subclassing:


لا تدعم العديد من أنواع البيانات الداخلية -مثل القوائم والقواميس- الإشارات الضعيفة على نحو مباشر، ولكن يمكن ذلك عن طريق التفريع subclassing:<syntaxhighlight lang="python3">
class Dict(dict):
class Dict(dict):
    pass
obj = Dict(red=1, green=2, blue=3)  # this object is weak referenceable


وهناك بعض الأنواع الداخلية التي لا تدعم الإشارات الضعيفة حتى مع التفريع مثل الصفوف. (This is an implementation detail and may be different across various Python implementations.).
  pass
obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable
</syntaxhighlight>وهناك بعض الأنواع الداخلية التي لا تدعم الإشارات الضعيفة حتى مع التفريع مثل الصفوف.


تقدم وحدة weakref الأصناف التالية:
تقدم وحدة <code>weakref</code> الأصناف التالية:

مراجعة 13:45، 23 أغسطس 2018


تتيح وحدة wekref إنشاء إشارات ضعيفة weak references للكائنات.

سنستخدم مصطلح الكائن المشار إليه للتعبير عن الكائن الذي يُشار إليه بإشارة ضعيفة.

لا تكون الإشارة الضعيفة إلى كائن معيّن كافية للإبقاء عليه، فعندما لا تبقى إلا الإشارات الضعيفة إلى الكائن المشار إليه، فلا يوجد ما يمنع مجموعة garbage من تدمير الكائن المشار إليه وإعادة استخدام الذاكرة التي يشغلها لأمر آخر. ولكن إلى حين تدمير الكائن فإنّ بإمكان الإشارة الضعيفة أن تعيد الكائن حتى في حال عدم وجود أي إشارات قوية strong إليه.

تظهر فائدة الإشارات الضعيفة عند الحاجة إلى استخدام الذاكرة المخبئية cache أو كائنات ربط تحمل كائنات كبيرة، بحيث يكون المطلوب عدم الإبقاء على الكائن الكبير فقط لأنّه ظهر في ذاكرة مخبئية أو في كائن ربط.

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

تقدّم وحدة weakref الصنفين WeakKeyDictionary و WeakValueDictionary كحل بديل، حيث تُستخدم الإشارات الضعيفة لبناء روابط لا تبقى على الكائنات لمجرّد ظهورها في كائنات الربط.

إن كان كائن صورة يمثّل قيمة في WeakValueDictionary ولا يتبقّى من الإشارات إلى هذا الكائن سوى الإشارات الضعيفة الموجودة في كائنات الربط الضعيفة، فسيكون حينئذٍ بمقدور مجموعة garbage أن تستعيد الكائن، وسيُحذف من كائنات الربط الضعيفة كلّها.

تستخدم WeakKeyDictionary و WeakValueDictionary الإشارات الضعيفة في عملها، حيث يجري إعداد دوال استدعاء خلفي على الإشارات الضعيفة والتي تنبه القواميس الضعيفة عندما تسترجع مجموعة garbage مفتاحًا أو قيمة من القاموس.

تتعامل WeakSet مع المجموعات، ولكنّها تبقي على الإشارات الضعيفة إلى عناصرها، كما هو الحال مع WeakKeyDictionary.

تقدم finalize طريقة مباشرة لتسجيل دوال التنظيف وذلك لاستدعائها عند استرجاع الكائن بواسطة مجموعة garbage، وهذه الطريقة أبسط من إعداد دالة استدعاء خلفي على إشارة ضعيفة، لأنّ الوحدة ستضمن على نحو تلقائي أنّ دالة الإنهاء finalizer ستبقى حيّة إلى حين جمع الكائن بواسطة مجموعة garbage.

يمكن لأنواع الحاويات الضعيفة أو التابع finalize أن تسد احتياجات معظم البرامج، وعادة ما لا تكون هناك حاجة إلى إنشاء إشارات ضعيفة خاصة. تتيح وحدة weakref التعامل مع المستوى الواطئ low-level وذلك لإنجاز مهام متقدّمة ومعقدة.

لا يمكن إنشاء إشارة ضعيفة لجميع الكائنات، ولكن يمكن إنشاء مثل هذه الإشارة لنسخ الأصناف، والدوال المكتوبة في بايثون (وليست مكتوبة في C)، وتوابع النسخ، والمجموعات، والمجموعات المجمّدة، وبعض كائنات الملفات، والمولّدات، وكائنات النوع، والمنافذ sockets، والمصفوفات، وكائنات deque، وكائنات أنماط التعابير النمطية، وكائنات code.

ملاحظة: أصبح بالإمكان إنشاء إشارات ضعيفة لكل من thread.lock و threading.Lock وكائنات code في الإصدار 3.2 من اللغة.

لا تدعم العديد من أنواع البيانات الداخلية -مثل القوائم والقواميس- الإشارات الضعيفة على نحو مباشر، ولكن يمكن ذلك عن طريق التفريع subclassing:

class Dict(dict):

   pass
obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable

وهناك بعض الأنواع الداخلية التي لا تدعم الإشارات الضعيفة حتى مع التفريع مثل الصفوف.

تقدم وحدة weakref الأصناف التالية: