zope.keyreference

البرمجيات قطة:
zope.keyreference
تفاصيل البرنامج:
الإصدار: 3.6.4
تاريخ إيداع: 15 Apr 15
ترخيص: حرر
شعبية: 1

Rating: nan/5 (Total Votes: 0)

وzope.keyreference توفر مراجع الكائنات التي تدعم مقارنة مستقرة والتجزئة.
أهم المراجع لكائنات الثابتة
يوفر zope.keyreference.persistent.KeyReferenceToPersistent إشارة zope.keyreference.interfaces.IKeyReference للكائنات الثابتة.
دعونا ننظر إلى مثال على ذلك. أولا، سنقوم خلق بعض الكائنات المستمرة في قاعدة بيانات:
على & nbsp؛ >>> من ZODB.MappingStorage استيراد DB
صفقة استيراد >>>؛ & نبسب
على & nbsp؛ >>> من persistent.mapping PersistentMapping استيراد
على & nbsp؛ >>> ديسيبل = DB ()
على & nbsp؛ >>> كون = db.open ()
على & nbsp؛ >>> الجذر = conn.root ()
على & nbsp؛ >>> الجذر ['ob1'] = PersistentMapping ()
على & nbsp؛ >>> الجذر ['ob2'] = PersistentMapping ()
على & nbsp؛ >>> transaction.commit ()
ثم سنقوم خلق بعض المراجع الرئيسية:
على & nbsp؛ >>> من zope.keyreference.persistent KeyReferenceToPersistent استيراد
على & nbsp؛ >>> key1 = KeyReferenceToPersistent (الجذر ['ob1'])
على & nbsp؛ >>> key2 = KeyReferenceToPersistent (الجذر ['ob2'])
يمكن أن نطلق مفاتيح للحصول على قطع:
على & nbsp؛ >>> key1 () هو الجذر ['ob1']، key2 () هو الجذر ['ob2']
على & nbsp؛ (صحيح، صحيح)
مفاتيح جديدة لنفس الأشياء متساوية إلى القديم:
على & nbsp؛ >>> KeyReferenceToPersistent (الجذر ['ob1']) == key1
على & nbsp؛ صحيح
ولها نفس التجزئة:
على & nbsp؛ >>> التجزئة (KeyReferenceToPersistent (الجذر ['ob1'])) == التجزئة (key1)
على & nbsp؛ صحيح
واختلف تطبيقات مرجعية رئيسية أخرى بحكم أساسي نوع معرف. يجب المراجع الرئيسية فرز أولا على نوع مفتاح والثانية على أي معلومات نوع محدد:
على & nbsp؛ >>> من الأدوات استيراد zope.interface
على & nbsp؛ >>> من zope.keyreference.interfaces استيراد IKeyReference
على & nbsp؛ >>> DummyKeyReference فئة (كائن):
على & nbsp؛ ... الأدوات (IKeyReference)
على & nbsp؛ ... key_type_id = 'zope.app.keyreference.object "
على & nbsp؛ ... مواطنه __init __ (النفس، الكائنات):
على & nbsp؛ ... self.object = الكائنات
على & nbsp؛ ... مواطنه __cmp __ (النفس، وغيرها):
على & nbsp؛ ... إذا self.key_type_id == other.key_type_id:
على & nbsp؛ ... عودة CMP (self.object، other.object)
على & nbsp؛ ... عودة CMP (self.key_type_id، other.key_type_id)
على & nbsp؛ >>> dummy_key1 = DummyKeyReference (كائن ())
على & nbsp؛ >>> dummy_key2 = DummyKeyReference (كائن ())
على & nbsp؛ >>> dummy_key3 = DummyKeyReference (كائن ())
على & nbsp؛ >>> مفاتيح = [key1، dummy_key1، dummy_key2، key2، dummy_key3]
على & nbsp؛ >>> keys.sort ()
على & nbsp؛ >>> key_type_ids = [key.key_type_id لمفتاح في مفاتيح]
على & nbsp؛ >>> key_type_ids [0: 3] .count ('zope.app.keyreference.object')
على & nbsp؛ 3
. على & nbsp؛ >>> key_type_ids [3]: عد ('zope.app.keyreference.persistent')
على & nbsp؛ 2
سنقوم بتخزين المراجع الرئيسية في قاعدة البيانات:
على & nbsp؛ >>> الجذر ['key1'] = key1
على & nbsp؛ >>> الجذر ['key2'] = key2
واستخدم مفاتيح لتخزين الأشياء مرة أخرى:
على & nbsp؛ >>> الجذر [key1] = الجذر ['ob1']
على & nbsp؛ >>> الجذر [key2] = الجذر ['ob2']
على & nbsp؛ >>> transaction.commit ()
الآن سنقوم بفتح اتصال آخر:
على & nbsp؛ >>> conn2 = db.open ()
والتحقق من أن نتمكن من استخدام مفاتيح للبحث عن الكائنات:
على & nbsp؛ >>> root2 = conn2.root ()
على & nbsp؛ >>> key1 = root2 ['key1']
على & nbsp؛ >>> root2 [key1] هو root2 ['ob1']
على & nbsp؛ صحيح
على & nbsp؛ >>> key2 = root2 ['key2']
على & nbsp؛ >>> root2 [key2] هو root2 ['ob2']
على & nbsp؛ صحيح
وأننا يمكن أيضا استدعاء مفاتيح للحصول على قطع:
على & nbsp؛ >>> key1 () هو root2 ['ob1']
على & nbsp؛ صحيح
على & nbsp؛ >>> key2 () هو root2 ['ob2']
على & nbsp؛ صحيح
ونحن لا يمكن الحصول على مرجعية رئيسية لكائن التي لم يتم حفظها بعد:
على & nbsp؛ >>> KeyReferenceToPersistent (PersistentMapping ())
على & nbsp؛ ... # doctest: + القطع
على & nbsp؛ Traceback (المكالمات الأخيرة الأخيرة):
على & nbsp؛ ...
على & nbsp؛ NotYet: ...
لاحظ أن نحصل على خطأ NotYet. هذا يشير إلى أننا قد تكون قادرة على الحصول على مرجع الرئيسية في وقت لاحق.
يمكننا الحصول على مراجع الكائنات التي لم يتم حفظها إذا كان لديهم محول لZODB.interfaces.IConnection. وسوف تستخدم طريقة إضافة على اتصال لإعطاء الكائن معرف الكائن، وهو ما يكفي من المعلومات لحساب المرجعية. لرؤية هذا، سنقوم إنشاء كائن الذي يتوافق مع IConnection بطريقة سخيفة:
على & nbsp؛ >>> استيراد المستمر
على & nbsp؛ >>> من ZODB.interfaces استيراد IConnection
على & nbsp؛ >>> الفئة C (persistent.Persistent):
على & nbsp؛ ... مواطنه __conform __ (النفس، iface):
على & nbsp؛ ... إذا iface هو IConnection:
على & nbsp؛ ... عودة conn2
على & nbsp؛ >>> ob3 = C ()
على & nbsp؛ >>> key3 = KeyReferenceToPersistent (ob3)
على & nbsp؛ >>> transaction.abort ()
حل النزاعات
خلال حل النزاعات، كما نوقش في ZODB / ConflictResolution.txt، ما يشير إلى الأشياء المستمرة هي في الواقع حالات ZODB.ConflictResolution.PersistentReference. هذا هو وثيق الصلة بطريقتين لKeyReferenceToPersistent. أولا، وهذا ما يفسر لدقة للطبقة: أنه لا يرث من persistent.Persistent. إذا كان الأمر كذلك، فإنه لن تكون متاحة لتسوية النزاعات، فقط PersistentReference جناحها في.
ثانيا، وهذا ما يفسر بعض التعليمات البرمجية في طرق __hash__ و__cmp__. هذه الأساليب لا يعالج فقط الأشياء persistent.Persistent، ولكن الأجسام PersistentReference. من دون هذا السلوك، والأشياء، مثل ZODB BTrees الكلاسيكية، والتي تستخدم KeyReferenceToPersistent كمفاتيح أو أعضاء مجموعة تكون قادرة على حل الصراعات. حتى مع رمز خاص، في بعض الحالات KeyReferenceToPersistent سوف ترفض مقارنة والتجزئة خلال حل النزاعات لأنها لا تستطيع أن تفعل ذلك بشكل موثوق.
__hash__ ستعمل نادرا نسبيا خلال حل النزاعات: فقط للحصول على مراجع multidatabase. هنا بضعة أمثلة.
على & nbsp؛ >>> من ZODB.ConflictResolution PersistentReference استيراد
على & nbsp؛ >>> مصنع مواطنه (المرجع):
على & nbsp؛ ... احتياط = KeyReferenceToPersistent .__ جديدة __ (
على & nbsp؛ ... KeyReferenceToPersistent، المرجع)
على & nbsp؛ ... res.object = المرجع
على & nbsp؛ ... عودة الدقة
على & nbsp؛ ...
على & nbsp؛ >>> التجزئة (مصنع (PersistentReference (
على & nbsp؛ ... ('على OID'، 'الطبقة الفوقية')))) # إشارة نموذجية
على & nbsp؛ Traceback (المكالمات الأخيرة الأخيرة):
على & nbsp؛ ...
على & nbsp؛ ValueError: اسم قاعدة البيانات غير متوفرة في هذا الوقت
على & nbsp؛ >>> منطقي (التجزئة (مصنع (PersistentReference (
على & nbsp؛ ... ['م'، ('قاعدة بيانات'، 'لOID'، 'الطبقة الفوقية')])))) # multidatabase
على & nbsp؛ صحيح
وهذا يعني أن KeyReferenceToPersistent وغالبا ما تعيق حل النزاعات لفئات مثل PersistentMapping.
__cmp__ يعمل إلا كائن واحد هو إشارة multidatabase والآخر ليس كذلك. وفيما يلي بعض الأمثلة على ذلك.
على & nbsp؛ >>> CMP (مصنع (PersistentReference (
على & nbsp؛ ... ('على OID'، 'الطبقة الفوقية')))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ('على OID'، 'الطبقة الفوقية'))))
على & nbsp؛ 0
على & nbsp؛ >>> CMP (مصنع (PersistentReference (
على & nbsp؛ ... ('على OID'، 'الطبقة الفوقية')))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ('آخر OID'، 'الطبقة الفوقية'))))
على & nbsp؛ -1
على & nbsp؛ >>> CMP (مصنع (PersistentReference ('على OID'))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ('على OID'، 'الطبقة الفوقية'))))
على & nbsp؛ 0
على & nbsp؛ >>> CMP (مصنع (PersistentReference ('على OID'))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ('على OID'، 'الطبقة الفوقية'))))
على & nbsp؛ 0
على & nbsp؛ >>> CMP (مصنع (PersistentReference (
على & nbsp؛ ... ['م'، ('قاعدة بيانات'، 'لOID'، 'الفوقية الدرجة')]))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ['م'، ('قاعدة بيانات'، 'لOID'، 'الطبقة الفوقية')])))
على & nbsp؛ 0
على & nbsp؛ >>> CMP (مصنع (PersistentReference (
على & nbsp؛ ... ['م'، ('قاعدة بيانات'، 'لOID'، 'الفوقية الدرجة')]))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ['ن'، ('قاعدة بيانات'، 'لOID')])))
على & nbsp؛ 0
على & nbsp؛ >>> CMP (مصنع (PersistentReference (
على & nbsp؛ ... ['م'، ('قاعدة بيانات'، 'لOID'، 'الفوقية الدرجة')]))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ['م'، ('قاعدة بيانات أخرى'، 'لOID'، 'الطبقة الفوقية')])))
على & nbsp؛ -1
على & nbsp؛ >>> CMP (مصنع (PersistentReference (
على & nbsp؛ ... ['م'، ('قاعدة بيانات'، 'لOID'، 'الفوقية الدرجة')]))،
على & nbsp؛ ... مصنع (PersistentReference (
على & nbsp؛ ... ('على OID'، 'الطبقة الفوقية'))))
على & nbsp؛ Traceback (المكالمات الأخيرة الأخيرة):
على & nbsp؛ ...
على & nbsp؛ ValueError: لا يمكن فرز موثوق
تعتمد على الموقع محول اتصال
وظيفة zope.keyreference.connectionOfPersistent تتكيف الكائنات لاتصالات باستخدام ارشادي تعتمد على الموقع بسيط. فحصها لمعرفة ما إذا كان الكائن يحتوي على __parent__ لديه اتصال:
على & nbsp؛ >>> من zope.keyreference.persistent connectionOfPersistent استيراد
على & nbsp؛ >>> ob3 = PersistentMapping ()
على & nbsp؛ >>> connectionOfPersistent الطباعة (ob3)
على & nbsp؛ لا يوجد
على & nbsp؛ >>> ob3 .__ parent__ = root2 ['ob1']
على & nbsp؛ >>> connectionOfPersistent (ob3) هو conn2
على & nbsp؛ صحيح

ما هو الجديد في هذا الإصدار:

إصلاح اختبارات تخللتها إزالة zope.testing من تبعيات الاختبار: تجنب وحدة ZODB3 التي يحتاج إليها.

المتطلبات:

بيثون

البرامج الأخرى من المطور Zope Corporation and Contributors

تعليقات ل zope.keyreference

لم يتم العثور على التعليقات
إضافة تعليق
بدوره على الصور!