zope.keyreference ให้อ้างอิงวัตถุที่สนับสนุนการเปรียบเทียบที่มั่นคงและแฮช
อ้างอิงที่สำคัญสำหรับวัตถุถาวร
zope.keyreference.persistent.KeyReferenceToPersistent ให้อ้างอิง zope.keyreference.interfaces.IKeyReference สำหรับวัตถุถาวร
ลองดูที่ตัวอย่างเช่น ครั้งแรกที่เราจะสร้างวัตถุถาวรบางส่วนในฐานข้อมูล:
& nbsp; >>> จาก ZODB.MappingStorage นำเข้า DB
& nbsp; >>> การทำธุรกรรมการนำเข้า
& nbsp; >>> จาก persistent.mapping นำเข้า PersistentMapping
& nbsp; >>> dB = DB ()
& nbsp; >>> conn = 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; (True, True)
คีย์ใหม่เพื่อวัตถุเดียวกันจะเท่ากับอายุ:
& nbsp; >>> KeyReferenceToPersistent (ราก ['OB1']) == key1
& nbsp; ที่แท้จริง
และมีการแฮชเดียวกัน:
& nbsp; >>> กัญชา (KeyReferenceToPersistent (ราก ['OB1'])) กัญชา == (key1)
& nbsp; ที่แท้จริง
การใช้งานอ้างอิงที่สำคัญอื่น ๆ จะแตกต่างกันโดย id ชนิดของพวกเขาที่สำคัญ การอ้างอิงที่สำคัญควรจัดเรียงแรกกับชนิดสำคัญของพวกเขาและครั้งที่สองเมื่อวันที่ข้อมูลประเภทที่เฉพาะเจาะจงใด ๆ
& nbsp; >>> จากการดำเนินการนำเข้า zope.interface
& nbsp; >>> นำเข้าจาก zope.keyreference.interfaces IKeyReference
& nbsp; >>> ชั้น DummyKeyReference (วัตถุ):
& nbsp; ... การดำเนินการ (IKeyReference)
& nbsp; ... key_type_id = 'zope.app.keyreference.object'
& nbsp; ... def __init __ (ตนเอง obj):
& nbsp; ... self.object = obj
& nbsp; ... def __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 วิธีการเพิ่มการเชื่อมต่อจะถูกนำมาใช้เพื่อให้วัตถุ id วัตถุซึ่งเป็นข้อมูลเพียงพอที่จะคำนวณการอ้างอิง ที่เห็นนี้เราจะสร้างวัตถุที่สอดคล้องกับ IConnection ในทางที่โง่:
& nbsp; >>> นำเข้าถาวร
& nbsp; >>> นำเข้าจาก ZODB.interfaces IConnection
& nbsp; >>> คลาส C (persistent.Persistent):
& nbsp; ... def __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; >>> โรงงาน def (อ้างอิง):
& nbsp; ... ความละเอียด = KeyReferenceToPersistent .__ ใหม่ __ (
& nbsp; ... KeyReferenceToPersistent อ้างอิง)
& nbsp; ... res.object = อ้างอิง
& nbsp; ... ความละเอียดผลตอบแทน
& nbsp; ...
& nbsp; >>> กัญชา (โรงงาน (PersistentReference (
& nbsp; ... ('OID', 'เมตาดาต้าที่ระดับ')))) # อ้างอิงทั่วไป
& nbsp; Traceback (โทรล่าสุดที่ผ่านมา):
& nbsp; ...
& nbsp; ValueError: ชื่อฐานข้อมูลใช้งานไม่ได้ในเวลานี้
& nbsp; >>> บูล (กัญชา (โรงงาน (PersistentReference (
& nbsp; ... ['M' ('ฐานข้อมูล', '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; ... ['M' ('ฐานข้อมูล', 'OID', 'เมตาดาต้าที่ระดับ')]))
& nbsp; ... โรงงาน (PersistentReference (
& nbsp; ... ['M' ('ฐานข้อมูล', 'OID', 'เมตาดาต้าที่ระดับ')])))
& nbsp; 0
& nbsp; >>> CMP (โรงงาน (PersistentReference (
& nbsp; ... ['M' ('ฐานข้อมูล', 'OID', 'เมตาดาต้าที่ระดับ')]))
& nbsp; ... โรงงาน (PersistentReference (
& nbsp; ... ['n' ('ฐานข้อมูล', 'OID')])))
& nbsp; 0
& nbsp; >>> CMP (โรงงาน (PersistentReference (
& nbsp; ... ['M' ('ฐานข้อมูล', 'OID', 'เมตาดาต้าที่ระดับ')]))
& nbsp; ... โรงงาน (PersistentReference (
& nbsp; ... ['M' ('ฐานข้อมูลอื่น', 'OID', 'เมตาดาต้าที่ระดับ')])))
& nbsp; -1
& nbsp; >>> CMP (โรงงาน (PersistentReference (
& nbsp; ... ['M' ('ฐานข้อมูล', '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; True
มีอะไรใหม่ ในข่าวประชาสัมพันธ์นี้:
- การทดสอบแก้ไขทำลายโดยการกำจัดของ zope.testing อ้างอิงจากการทดสอบ หลีกเลี่ยงโมดูล ZODB3 ที่ต้องการมัน.
ต้องการ
- หลาม
ความคิดเห็นที่ไม่พบ