zope.keyreference

Screenshot Λογισμικό:
zope.keyreference
Στοιχεία Λογισμικού:
Εκδοχή: 3.6.4
Ανεβάστε ημερομηνία: 15 Apr 15
Προγραμματιστής: Zope Corporation and Contributors
Άδεια: Δωρεάν
Δημοτικότητα: 1

Rating: nan/5 (Total Votes: 0)

zope.keyreference παρέχει αναφορές σε αντικείμενα που υποστηρίζουν σταθερά σύγκριση και hashes.
Βασικά αναφορές για τους έμμονους αντικείμενα
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? >>> Root = conn.root ()
& Nbsp? >>> Ρίζα [«OB1 '] = PersistentMapping ()
& Nbsp? >>> Ρίζα [«OB2 '] = PersistentMapping ()
& Nbsp? >>> Transaction.commit ()
Στη συνέχεια θα δημιουργήσουμε κάποιες βασικές αναφορές:
& Nbsp? >>> Από zope.keyreference.persistent KeyReferenceToPersistent εισαγωγής
& Nbsp? >>> Key1 = KeyReferenceToPersistent (root [«OB1 '])
& Nbsp? >>> Key2 = KeyReferenceToPersistent (root [«OB2 '])
Μπορούμε να ονομάσουμε τα κλειδιά για να πάρει τα αντικείμενα:
& Nbsp? >>> Key1 () είναι η ρίζα [«OB1»], key2 () είναι η ρίζα [«OB2»]
& Nbsp? (True, True)
Νέα κλειδιά με τα ίδια αντικείμενα είναι ίσα με το παλιό:
& Nbsp? >>> KeyReferenceToPersistent (ρίζα [«OB1 ']) == key1
& Nbsp? True
και έχουν τις ίδιες hashes:
& Nbsp? >>> Hash (KeyReferenceToPersistent (ρίζα [«OB1 '])) == κατακερματισμού (key1)
& Nbsp? True
Άλλες βασικές υλοποιήσεις αναφοράς διέφεραν από τους βασικούς id τύπο τους. Βασικές αναφορές θα πρέπει να ταξινομήσετε πρώτα για τις βασικές τον τύπο τους και το δεύτερο για οποιαδήποτε πληροφορία ειδικού τύπου:
& Nbsp? >>> Από zope.interface εργαλεία εισαγωγής
& Nbsp? >>> Από zope.keyreference.interfaces εισαγωγή IKeyReference
& Nbsp? >>> Κατηγορία DummyKeyReference (αντικείμενο):
& Nbsp? ... Εργαλεία (IKeyReference)
& Nbsp? ... Key_type_id = 'zope.app.keyreference.object »
& Nbsp? ... Def __init __ (self, obj):
& Nbsp? ... Self.object = obj
& Nbsp? ... Def __cmp __ (self, other):
& 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? True
& Nbsp? >>> Key2 = root2 [«key2»]
& Nbsp? >>> Root2 [key2] είναι root2 [«OB2»]
& Nbsp? True
και ότι μπορούμε επίσης να καλέσετε τα κλειδιά για να πάρει τα αντικείμενα:
& Nbsp? >>> Key1 () είναι root2 [«OB1»]
& Nbsp? True
& Nbsp? >>> Key2 () είναι root2 [«OB2»]
& Nbsp? True
Δεν μπορεί να πάρει το κλειδί αναφοράς για ένα αντικείμενο που δεν έχει σωθεί ακόμα:
& Nbsp? >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp? ... # Doctest: + ελλειπτικό
& Nbsp? Traceback (πιο πρόσφατη κλήση τελευταία):
& Nbsp? ...
& Nbsp? NotYet: ...
Σημειώστε ότι έχουμε ένα σφάλμα NotYet. Αυτό δείχνει ότι μπορεί να είμαστε σε θέση να πάρετε ένα βασικό σημείο αναφοράς αργότερα.
Μπορούμε να πάρουμε αναφορές σε μη αποθηκευμένες αντικείμενα αν έχουν έναν προσαρμογέα για ZODB.interfaces.IConnection. Η μέθοδος add στη σύνδεση, θα πρέπει να χρησιμοποιηθεί για να δώσει στο αντικείμενο ένα αναγνωριστικό αντικειμένου, το οποίο είναι αρκετές πληροφορίες για να υπολογίσει την αναφορά. Για να δείτε αυτό, θα δημιουργήσουμε ένα αντικείμενο που είναι σύμφωνο με IConnection σε ένα ανόητο τρόπο:
& Nbsp? >>> Εισαγωγή επίμονη
& Nbsp? >>> Από ZODB.interfaces εισαγωγή IConnection
& Nbsp? >>> Κατηγορίας Γ (persistent.Persistent):
& Nbsp? ... Def __conform __ (self, iface):
& Nbsp? ... Αν iface είναι IConnection:
& Nbsp? ... Conn2 επιστροφή
& Nbsp? >>> ΟΒ3 = C ()
& Nbsp? >>> Key3 = KeyReferenceToPersistent (ΟΒ3)
& Nbsp? >>> Transaction.abort ()
Επίλυση Συγκρούσεων
Κατά τη διάρκεια της επίλυσης συγκρούσεων, όπως συζητήθηκε στην ZODB / ConflictResolution.txt, αναφορές σε επίμονες αντικείμενα είναι στην πραγματικότητα περιπτώσεις ZODB.ConflictResolution.PersistentReference. Αυτό είναι σχετικό με δύο τρόπους για KeyReferenceToPersistent. Πρώτον, εξηγεί λεπτότητα της κατηγορίας: δεν κληρονομούν από persistent.Persistent. Αν συνέβαινε αυτό, δεν θα ήταν διαθέσιμα για την επίλυση των συγκρούσεων, μόλις PersistentReference του stand-in.
Δεύτερον, εξηγεί μερικές από τις κώδικα στις μεθόδους __hash__ και __cmp__. Οι μέθοδοι αυτές δεν χειρίζονται μόνο persistent.Persistent αντικείμενα, αλλά PersistentReference αντικείμενα. Χωρίς αυτή τη συμπεριφορά, τα αντικείμενα, όπως το κλασικό ZODB BTrees, που χρησιμοποιούν KeyReferenceToPersistent όπως κλειδιά ή σετ μέλη θα είναι σε θέση να επιλύσει τις συγκρούσεις. Ακόμη και με τον ειδικό κωδικό, σε ορισμένες περιπτώσεις, η KeyReferenceToPersistent θα αρνηθεί να συγκρίνετε και κατακερματισμού κατά την επίλυση των συγκρούσεων, επειδή δεν μπορεί να κάνει αξιόπιστα έτσι.
__hash__ θα λειτουργήσει σχετικά σπάνια κατά τη διάρκεια της επίλυσης συγκρούσεων: μόνο για τις αναφορές multidatabase. Εδώ είναι μερικά παραδείγματα.
& Nbsp? >>> Από ZODB.ConflictResolution PersistentReference εισαγωγής
& Nbsp? >>> Εργοστάσιο def (διαιτητής):
& Nbsp? ... Res = KeyReferenceToPersistent .__ νέα __ (
& Nbsp? ... KeyReferenceToPersistent, ref)
& Nbsp? ... Res.object = διαιτητή
& Nbsp? Res ... επιστροφή
& Nbsp? ...
& Nbsp? >>> Hash (εργοστάσιο (PersistentReference (
& Nbsp? ... («Ένα OID», «μεταδεδομένα κατηγορία»)))) # Μια τυπική αναφορά
& Nbsp? Traceback (πιο πρόσφατη κλήση τελευταία):
& Nbsp? ...
& Nbsp? ValueError: όνομα της βάσης δεδομένων δεν είναι διαθέσιμη αυτή τη στιγμή
& Nbsp? >>> Bool (hash (εργοστάσιο (PersistentReference (
& Nbsp? ... [«M», («μια βάση δεδομένων», «ένα OID», «μεταδεδομένα τάξη»)])))) # multidatabase
& Nbsp? True
Αυτό σημαίνει ότι KeyReferenceToPersistent θα εμποδίζουν συχνά την επίλυση των συγκρούσεων για τις κατηγορίες όπως PersistentMapping.
__cmp__ λειτουργεί εκτός εάν ένα αντικείμενο είναι ένα multidatabase αναφοράς και το άλλο δεν είναι. Εδώ είναι μερικά παραδείγματα.
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference (
& Nbsp? ... («Ένα OID», «μεταδεδομένα κατηγορία»))),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... («Ένα OID», «μεταδεδομένα κατηγορία»))))
& Nbsp? 0
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference (
& Nbsp? ... («Ένα OID», «μεταδεδομένα κατηγορία»))),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... («Άλλο OID», «μεταδεδομένα κατηγορία»))))
& Nbsp? -1
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference («ένα OID ')),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... («Ένα OID», «μεταδεδομένα κατηγορία»))))
& Nbsp? 0
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference («ένα OID ')),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... («Ένα OID», «μεταδεδομένα κατηγορία»))))
& Nbsp? 0
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference (
& Nbsp? ... [«M», («μια βάση δεδομένων», «ένα OID», «μεταδεδομένα τάξη»)])),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... [«M», («μια βάση δεδομένων», «ένα OID», «μεταδεδομένα τάξη»)])))
& Nbsp? 0
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference (
& Nbsp? ... [«M», («μια βάση δεδομένων», «ένα OID», «μεταδεδομένα τάξη»)])),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... [«Ν», («μια βάση δεδομένων», «ένα OID ')])))
& Nbsp? 0
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference (
& Nbsp? ... [«M», («μια βάση δεδομένων», «ένα OID», «μεταδεδομένα τάξη»)])),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... [«M», («μια άλλη βάση δεδομένων», «ένα OID», «μεταδεδομένα τάξη»)])))
& Nbsp? -1
& Nbsp? >>> ΔΕΑ (εργοστάσιο (PersistentReference (
& Nbsp? ... [«M», («μια βάση δεδομένων», «ένα OID», «μεταδεδομένα τάξη»)])),
& Nbsp? ... Εργοστάσιο (PersistentReference (
& Nbsp? ... («Ένα OID», «μεταδεδομένα κατηγορία»))))
& Nbsp? Traceback (πιο πρόσφατη κλήση τελευταία):
& Nbsp? ...
& Nbsp? ValueError: δεν μπορείτε να ταξινομήσετε αξιόπιστα
Location-based προσαρμογέας σύνδεσης
Η zope.keyreference.connectionOfPersistent λειτουργία προσαρμόζει τα αντικείμενα σε συνδέσεις χρησιμοποιώντας ένα απλό location-based ευρετική. Θα ελέγχονται για να διαπιστωθεί εάν το αντικείμενο έχει __parent__ που έχει μια σύνδεση:
& Nbsp? >>> Από zope.keyreference.persistent connectionOfPersistent εισαγωγής
& Nbsp? >>> ΟΒ3 = PersistentMapping ()
& Nbsp? >>> ConnectionOfPersistent εκτύπωσης (ΟΒ3)
& Nbsp? Κανένα
& Nbsp? >>> ΟΒ3 .__ parent__ = root2 [«OB1»]
& Nbsp? >>> ConnectionOfPersistent (ΟΒ3) είναι conn2
& Nbsp? True

Τι είναι καινούργιο σε αυτήν την έκδοση:

  • δοκιμές Fix σπασμένα από την απομάκρυνση του zope.testing από εξαρτήσεις δοκιμής: αποφύγετε τη μονάδα ZODB3 που χρειάζεται.

Απαιτήσεις :

  • Python

Άλλο λογισμικό του προγραμματιστή Zope Corporation and Contributors

zope.generations
zope.generations

15 Apr 15

zope.app.container
zope.app.container

14 Apr 15

zope.html
zope.html

14 Apr 15

zope.app.rotterdam
zope.app.rotterdam

14 Apr 15

Σχόλια για zope.keyreference

Τα σχόλια δεν βρέθηκε
προσθήκη σχολίου
Ενεργοποιήστε τις εικόνες!