الفرق بين المراجعتين ل"Python/weakref"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:الوحدة <code>weakref‎</code> في بايثون}}</noinclude> تتيح وحدة wekref إنشاء إشارات ضعيفة weak referenc...')
 
 
(6 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:الوحدة <code>weakref‎</code> في بايثون}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:الوحدة <code>weakref‎</code> في بايثون}}</noinclude>
  
تتيح وحدة wekref إنشاء إشارات ضعيفة weak references للكائنات.
+
تتيح وحدة <code>wekref</code> إنشاء إشارات ضعيفة weak references للكائنات.
 +
 
 +
__TOC__
  
 
سنستخدم مصطلح الكائن المشار إليه للتعبير عن الكائن الذي يُشار إليه بإشارة ضعيفة.
 
سنستخدم مصطلح الكائن المشار إليه للتعبير عن الكائن الذي يُشار إليه بإشارة ضعيفة.
سطر 11: سطر 13:
 
فعلى سبيل المثال، إن كان لديك عدد من كائنات ملفات ثنائية لصور كبيرة الحجم، فقد ترغب في إعطاء اسم خاص لكل كائن. إن استخدمت قاموس بايثون لربط الأسماء بالصور أو الصور بالأسماء، فإنّ كائنات الصور ستبقى حيّة لسبب واحد فقط، وهو أنّها ظهرت كقيم أو مفاتيح في القواميس.
 
فعلى سبيل المثال، إن كان لديك عدد من كائنات ملفات ثنائية لصور كبيرة الحجم، فقد ترغب في إعطاء اسم خاص لكل كائن. إن استخدمت قاموس بايثون لربط الأسماء بالصور أو الصور بالأسماء، فإنّ كائنات الصور ستبقى حيّة لسبب واحد فقط، وهو أنّها ظهرت كقيم أو مفاتيح في القواميس.
  
تقدّم وحدة weakref الصنفين TheWeakKeyDictionary و WeakValueDictionary كحل بديل، حيث تُستخدم الإشارات الضعيفة لبناء روابط لا تبقى على الكائنات لمجرّد ظهورها في كائنات الربط.  
+
تقدّم وحدة <code>weakref</code> الصنفين <code>WeakKeyDictionary</code> و <code>WeakValueDictionary</code> كحل بديل، حيث تُستخدم الإشارات الضعيفة لبناء روابط لا تبقى على الكائنات لمجرّد ظهورها في كائنات الربط.
 +
 
 +
إن كان كائن صورة يمثّل قيمة في <code>WeakValueDictionary</code> ولا يتبقّى من الإشارات إلى هذا الكائن سوى الإشارات الضعيفة الموجودة في كائنات الربط الضعيفة، فسيكون حينئذٍ بمقدور مجموعة garbage أن تستعيد الكائن، وسيُحذف من كائنات الربط الضعيفة كلّها.
 +
 
 +
تستخدم <code>WeakKeyDictionary</code> و <code>WeakValueDictionary</code> الإشارات الضعيفة في عملها، حيث يجري إعداد دوال استدعاء خلفي على الإشارات الضعيفة والتي تنبه القواميس الضعيفة عندما تسترجع مجموعة garbage مفتاحًا أو قيمة من القاموس.
 +
 
 +
تتعامل <code>WeakSet</code> مع المجموعات، ولكنّها تبقي على الإشارات الضعيفة إلى عناصرها، كما هو الحال مع <code>WeakKeyDictionary</code>.
 +
 
 +
تقدم <code>finalize</code> طريقة مباشرة لتسجيل دوال التنظيف وذلك لاستدعائها عند استرجاع الكائن بواسطة مجموعة garbage، وهذه الطريقة أبسط من إعداد دالة استدعاء خلفي على إشارة ضعيفة، لأنّ الوحدة ستضمن على نحو تلقائي أنّ دالة الإنهاء <code>finalizer</code> ستبقى حيّة إلى حين جمع الكائن بواسطة مجموعة garbage.
 +
 
 +
يمكن لأنواع الحاويات الضعيفة أو التابع <code>finalize</code> أن تسد احتياجات معظم البرامج، وعادة ما لا تكون هناك حاجة إلى إنشاء إشارات ضعيفة خاصة. تتيح وحدة <code>weakref</code> التعامل مع المستوى الواطئ low-level وذلك لإنجاز مهام متقدّمة ومعقدة.
 +
 
 +
لا يمكن إنشاء إشارة ضعيفة لجميع الكائنات، ولكن يمكن إنشاء مثل هذه الإشارة [[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]].
 +
 
 +
ملاحظة: أصبح بالإمكان إنشاء إشارات ضعيفة لكل من <code>thread.lock</code> و <code>threading.Lock</code> وكائنات code في الإصدار 3.2 من اللغة.
 +
 
 +
لا تدعم العديد من أنواع البيانات الداخلية -مثل القوائم والقواميس- الإشارات الضعيفة على نحو مباشر، ولكن يمكن ذلك عن طريق التفريع subclassing:<syntaxhighlight lang="python3">
 +
class Dict(dict):
 +
 
 +
  pass
 +
obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable
 +
</syntaxhighlight>وهناك بعض الأنواع الداخلية التي لا تدعم الإشارات الضعيفة حتى مع التفريع مثل الصفوف.
 +
 
 +
== دوال الوحدة <code>weakref</code> ==
 +
تقدم وحدة <code>weakref</code> الدوال التالية:
 +
 
 +
=== الدالة <code>[[Python/weakref/ref|ref()‎]]</code> ===
 +
دالة بانية للصنف <code>ref</code> وتعيد إشارة ضعيفة إلى الكائن المعطى.
 +
 
 +
=== الدالة <code>[[Python/weakref/proxy|proxy()]]‎</code> ===
 +
تعيد الدالة وسيطًا proxy للكائن المعطى والذي يستخدم إشارة ضعيفة.
 +
 
 +
=== الدالة <code>[[Python/weakref/getweakrefcount|getweakrefcount()]]‎</code> ===
 +
تعيد الدالة عدد الإشارات الضعيفة والوسائط المرتبطة بالعنصر المعطى.
  
إن كان كائن صورة يمثّل قيمة في WeakValueDictionary ولا يتبقّى من الإشارات إلى هذا الكائن سوى الإشارات الضعيفة الموجودة في كائنات الربط الضعيفة، فسيكون حينئذٍ بمقدور مجموعة garbage أن تستعيد الكائن، وسيُحذف من كائنات الربط الضعيفة كلّها.
+
=== الدالة <code>[[Python/weakref/getweakrefs|getweakrefs()]]‎</code> ===
 +
تعيد الدالة قائمة بكل الإشارات الضعيفة وكائنات الوسيط المرتبطة بالكائن المعطى.
  
تستخدم WeakKeyDictionary و WeakValueDictionary الإشارات الضعيفة في عملها، حيث يجري إعداد دوال استدعاء خلفي على الإشارات الضعيفة والتي تنبه القواميس الضعيفة عندما تسترجع مجموعة garbage مفتاحًا أو قيمة من القاموس.
+
=== الدالة <code>[[Python/weakref/WeakKeyDictionary|WeakKeyDictionary()]]‎</code> ===
 +
صنف ربط ينشئ إشارات ضعيفة إلى المفاتيح.
  
تتعامل WeakSet مع المجموعات، ولكنّها تبقي على الإشارات الضعيفة إلى عناصرها، كما هو الحال مع WeakKeyDictionary.
+
=== الدالة <code>[[Python/weakref/WeakValueDictionary|WeakValueDictionary()]]‎</code> ===
 +
صنف ربط ينشئ إشارات ضعيفة إلى القيم. يجري تجاهل عناصر القاموس عند عدم وجود إشارات قوية إلى القيم.
  
تقدم finalize طريقة مباشرة لتسجيل دوال التنظيف وذلك لاستدعائها عند استرجاع الكائن بواسطة مجموعة garbage، وهذه الطريقة أبسط من إعداد دالة استدعاء خلفي على إشارة ضعيفة، لأنّ الوحدة ستضمن على نحو تلقائي أنّ دالة الإنهاء finalizer ستبقى حيّة إلى حين جمع الكائن بواسطة مجموعة garbage.
+
=== الدالة <code>[[Python/weakref/WeakSet|WeakSet()‎]]</code> ===
 +
صنف مجموعة يحتفظ بالإشارات الضعيفة لعناصره. سيجري تجاهل العنصر عند عدم وجود أي إشارة قوية إليه.
  
يمكن لأنواع الحاويات الضعيفة أو التابع finalize أن تسد احتياجات معظم البرامج، وعادة ما لا تكون هناك حاجة إلى إنشاء إشارات ضعيفة خاصة. تقدّم وحدة weakref آلية عمل المستوى الواطئ low-level وذلك
+
=== الدالة <code>[[Python/weakref/WeakMethod|WeakMethod()‎]]</code> ===
The low-level machinery is exposed by the weakref module for the benefit of advanced uses.
+
صنف فرعي خاصّ من الصنف ref يحاكي إشارة ضعيفة إلى تابع مرتبط (أي تابع معرف في صنف ومبحوث عنه في نسخة من ذلك الصنف).
  
لا يمكن إنشاء إشارة ضعيفة لجميع الكائنات، ولكن يمكن إنشاء مثل هذه الإشارة لنسخ الأصناف، والدوال المكتوبة في بايثون (وليست مكتوبة في C)، وتوابع النسخ، والمجموعات، والمجموعات المجمّدة، وبعض كائنات الملفات، والمولّدات، وكائنات النوع، والمنافذ sockets، والمصفوفات، وكائنات deque، وكائنات أنماط التعابير النمطية، وكائنات code.
+
=== الدالة <code>[[Python/weakref/finalize|finalize()‎]]</code> ===
 +
يعيد هذا الصنف كائن إنهاء <code>finalzier</code> قابل للاستدعاء، ويجري استدعاؤه عند استرجاع الكائن المعطى بواسطة مجموعة garbage.
  
ملاحظة: أصبح بالإمكان إنشاء إشارات ضعيفة لكل من thread.lock و threading.Lock وكائنات code في الإصدار 3.2 من اللغة.
+
== خصائص الوحدة weakref ==
  
لا تدعم العديد من أنواع البيانات الداخلية -مثل القوائم والقواميس- الإشارات الضعيفة على نحو مباشر، ولكن يمكن ذلك عن طريق التفريع subclassing:
+
=== <code>weakref.ReferenceType</code> ===
 +
كائن النوع الخاصّ بكائنات الإشارة الضعيفة.
  
class Dict(dict):
+
=== <code>weakref.ProxyType</code> ===
    pass
+
كائن النوع الخاصّ بوسائط الكائنات التي تكون غير قابلة للاستدعاء.
 +
 
 +
=== <code>weakref.CallableProxyType</code> ===
 +
كائن النوع الخاصّ بوسائط الكائنات التي تكون قابلة للاستدعاء.
 +
 
 +
=== <code>weakref.ProxyTypes</code> ===
 +
تسلسل يتضمّن جميع كائنات النوع الخاصّة بالوسائط. يسهّل هذا التسلسل عملية التحقّق ممّا إذا كان الكائن وسيطًا دون الاعتماد على تسمية نوعي الوسائط.
 +
 
 +
== استثناءات الوحدة <code>weakref</code> ==
 +
تقدّم وحدة <code>weakref</code> استثناءً واحدًا هو:
 +
 
 +
=== الاستثناء<code>weakref.ReferenceError</code> ===
 +
يطلق هذا الاستثناء عند استخدام كائن الوسيط في الوقت الذي يكون فيه الكائن الضمّني في مجموعة garbage. هذا الاستثناء مشابه للاستثناء <code>ReferenceError</code>.
 +
 
 +
== كائنات الإشارة الضعيفة ==
 +
لا تمتلك كائنات الإشارة الضعيفة أيّ توابع أو خصائص باستثناء الخاصية <code>ref.__callback__‎</code>. يسمح كائن الإشارة الضعيفة بالوصول إلى الكائن المشار إليه -في حال وجوده- عن طريق استدعائه:<syntaxhighlight lang="python3">
 +
>>> import weakref
 +
>>> class Object:
 +
...     pass
 +
...
 +
>>> o = Object()
 +
>>> r = weakref.ref(o)
 +
>>> o2 = r()
 +
>>> o is o2
 +
True
 +
</syntaxhighlight>إن لم يعد الكائن المشار إليه متوفّرًا، يعيد استدعاء كائن الإشارة القيمة <code>None</code>:<syntaxhighlight lang="python3">
 +
>>> del o, o2
 +
>>> print(r())
 +
None
 +
</syntaxhighlight>يجب استخدام التعبير <code>ref() is not None</code> للتحقّق من كون كائن الإشارة حيًّا أو لا، وفي العادة يجب أن تتبع الشيفرة التي تكون بحاجة إلى استخدام كائن الإشارة النمط التالي:<syntaxhighlight lang="python3">
 +
# كائن إشارة ضعيف r
 +
o = r()
 +
if o is None:
 +
    # تم جمع الكائن المشار إليه في القمامة
 +
    print("Object has been deallocated; can't frobnicate.")
 +
else:
 +
    print("Object is still live!")
 +
    o.do_something_useful()
 +
</syntaxhighlight>يؤدي إجراء اختبارات منفصلة إلى إنشاء حالات تسابق في التطبيقات ذات الخيوط المتعددة threaded، إذ يمكن لخيط آخر أن يتسبب في إلغاء الإشارة الضعيفة قبل استدعائها. يمكن استخدام النمط المعروض أعلاه على نحو آمن في التطبيقات ذات الخيوط المفردة والمتعددة.
 +
 
 +
يمكن إنشاء نسخ خاصة من كائنات <code>ref</code> عن طريق التفريع، وتستخدم هذه الطريقة مع <code>WeakValueDictionary</code> لتخفيض استهلاك الذاكرة لكل عنصر في عملية الربط. وتزداد أهمية هذه الطريقة عند ربط معلومات إضافية مع الإشارة، ويمكن كذلك استخدامها لإدراج عمليات إضافية في الاستدعاءات وذلك لاسترجاع الكائن المشار إليه.
  
obj = Dict(red=1, green=2, blue=3)   # this object is weak referenceable
+
يبين المثال التالي كيفية استخدام صنف متفرّع من الكائن ref لتخزين معلومات إضافية عن الكائن والتأثير على القيمة المعادة عند الوصول إلى الكائن المشار إليه:<syntaxhighlight lang="python3">
 +
import weakref
 +
class ExtendedRef(weakref.ref):
 +
    def __init__(self, ob, callback=None, **annotations):
 +
        super(ExtendedRef, self).__init__(ob, callback)
 +
        self.__counter = 0
 +
        for k, v in annotations.items():
 +
            setattr(self, k, v)
 +
    def __call__(self):
 +
        """Return a pair containing the referent and the number of
 +
        times the reference has been called.
 +
        """
 +
        ob = super(ExtendedRef, self).__call__()
 +
        if ob is not None:
 +
            self.__counter += 1
 +
            ob = (ob, self.__counter)
 +
        return ob
 +
</syntaxhighlight>
  
وهناك بعض الأنواع الداخلية التي لا تدعم الإشارات الضعيفة حتى مع التفريع مثل الصفوف. (This is an implementation detail and may be different across various Python implementations.).
+
== مثال ==
 +
يبين هذا المثال البسيط كيف أنّ بإمكان البرنامج استخدام معرّفات الكائنات لاستعادة الكائنات التي رآها من قبل. يمكن بعد ذلك استخدام معرّفات الكائنات في بنى بيانات مختلفة دون الحاجة إلى إبقاء الكائنات حيّة، ويمكن استرجاع الكائنات بواسطة معرّفاتها عند الحاجة.<syntaxhighlight lang="python3">
 +
import weakref
 +
_id2obj_dict = weakref.WeakValueDictionary()
 +
def remember(obj):
 +
    oid = id(obj)
 +
    _id2obj_dict[oid] = obj
 +
    return oid
 +
def id2obj(oid):
 +
    return _id2obj_dict[oid]
 +
</syntaxhighlight>
  
تقدم وحدة weakref الأصناف التالية:
+
== مصادر ==
 +
* [https://docs.python.org/3/library/weakref.html صفحة Weak references في توثيق بايثون الرسمي.]
 +
[[تصنيف:Python]]
 +
[[تصنيف:Python Modules]]

المراجعة الحالية بتاريخ 15:47، 27 أغسطس 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

تقدم وحدة weakref الدوال التالية:

الدالة ref()‎

دالة بانية للصنف ref وتعيد إشارة ضعيفة إلى الكائن المعطى.

الدالة proxy()

تعيد الدالة وسيطًا proxy للكائن المعطى والذي يستخدم إشارة ضعيفة.

الدالة getweakrefcount()

تعيد الدالة عدد الإشارات الضعيفة والوسائط المرتبطة بالعنصر المعطى.

الدالة getweakrefs()

تعيد الدالة قائمة بكل الإشارات الضعيفة وكائنات الوسيط المرتبطة بالكائن المعطى.

الدالة WeakKeyDictionary()

صنف ربط ينشئ إشارات ضعيفة إلى المفاتيح.

الدالة WeakValueDictionary()

صنف ربط ينشئ إشارات ضعيفة إلى القيم. يجري تجاهل عناصر القاموس عند عدم وجود إشارات قوية إلى القيم.

الدالة WeakSet()‎

صنف مجموعة يحتفظ بالإشارات الضعيفة لعناصره. سيجري تجاهل العنصر عند عدم وجود أي إشارة قوية إليه.

الدالة WeakMethod()‎

صنف فرعي خاصّ من الصنف ref يحاكي إشارة ضعيفة إلى تابع مرتبط (أي تابع معرف في صنف ومبحوث عنه في نسخة من ذلك الصنف).

الدالة finalize()‎

يعيد هذا الصنف كائن إنهاء finalzier قابل للاستدعاء، ويجري استدعاؤه عند استرجاع الكائن المعطى بواسطة مجموعة garbage.

خصائص الوحدة weakref

weakref.ReferenceType

كائن النوع الخاصّ بكائنات الإشارة الضعيفة.

weakref.ProxyType

كائن النوع الخاصّ بوسائط الكائنات التي تكون غير قابلة للاستدعاء.

weakref.CallableProxyType

كائن النوع الخاصّ بوسائط الكائنات التي تكون قابلة للاستدعاء.

weakref.ProxyTypes

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

استثناءات الوحدة weakref

تقدّم وحدة weakref استثناءً واحدًا هو:

الاستثناءweakref.ReferenceError

يطلق هذا الاستثناء عند استخدام كائن الوسيط في الوقت الذي يكون فيه الكائن الضمّني في مجموعة garbage. هذا الاستثناء مشابه للاستثناء ReferenceError.

كائنات الإشارة الضعيفة

لا تمتلك كائنات الإشارة الضعيفة أيّ توابع أو خصائص باستثناء الخاصية ref.__callback__‎. يسمح كائن الإشارة الضعيفة بالوصول إلى الكائن المشار إليه -في حال وجوده- عن طريق استدعائه:

>>> import weakref
>>> class Object:
...     pass
...
>>> o = Object()
>>> r = weakref.ref(o)
>>> o2 = r()
>>> o is o2
True

إن لم يعد الكائن المشار إليه متوفّرًا، يعيد استدعاء كائن الإشارة القيمة None:

>>> del o, o2
>>> print(r())
None

يجب استخدام التعبير ref() is not None للتحقّق من كون كائن الإشارة حيًّا أو لا، وفي العادة يجب أن تتبع الشيفرة التي تكون بحاجة إلى استخدام كائن الإشارة النمط التالي:

# كائن إشارة ضعيف r
o = r()
if o is None:
    # تم جمع الكائن المشار إليه في القمامة
    print("Object has been deallocated; can't frobnicate.")
else:
    print("Object is still live!")
    o.do_something_useful()

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

يمكن إنشاء نسخ خاصة من كائنات ref عن طريق التفريع، وتستخدم هذه الطريقة مع WeakValueDictionary لتخفيض استهلاك الذاكرة لكل عنصر في عملية الربط. وتزداد أهمية هذه الطريقة عند ربط معلومات إضافية مع الإشارة، ويمكن كذلك استخدامها لإدراج عمليات إضافية في الاستدعاءات وذلك لاسترجاع الكائن المشار إليه.

يبين المثال التالي كيفية استخدام صنف متفرّع من الكائن ref لتخزين معلومات إضافية عن الكائن والتأثير على القيمة المعادة عند الوصول إلى الكائن المشار إليه:

import weakref
class ExtendedRef(weakref.ref):
    def __init__(self, ob, callback=None, **annotations):
        super(ExtendedRef, self).__init__(ob, callback)
        self.__counter = 0
        for k, v in annotations.items():
            setattr(self, k, v)
    def __call__(self):
        """Return a pair containing the referent and the number of
        times the reference has been called.
        """
        ob = super(ExtendedRef, self).__call__()
        if ob is not None:
            self.__counter += 1
            ob = (ob, self.__counter)
        return ob

مثال

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

import weakref
_id2obj_dict = weakref.WeakValueDictionary()
def remember(obj):
    oid = id(obj)
    _id2obj_dict[oid] = obj
    return oid
def id2obj(oid):
    return _id2obj_dict[oid]

مصادر