zope.keyreference

Phần mềm chụp màn hình:
zope.keyreference
Các chi tiết về phần mềm:
Phiên bản: 3.6.4
Ngày tải lên: 15 Apr 15
Giấy phép: Miễn phí
Phổ biến: 1

Rating: nan/5 (Total Votes: 0)

zope.keyreference cung cấp tài liệu tham khảo đối tượng hỗ trợ so sánh và băm ổn định.
Tài liệu tham khảo chính cho các đối tượng liên tục
zope.keyreference.persistent.KeyReferenceToPersistent cung cấp một tài liệu tham khảo cho zope.keyreference.interfaces.IKeyReference đối tượng liên tục.
Hãy xem xét một ví dụ. Đầu tiên, chúng ta sẽ tạo ra một số đối tượng liên tục trong một cơ sở dữ liệu:
& Nbsp; >>> từ ZODB.MappingStorage nhập DB
& Nbsp; >>> giao dịch nhập khẩu
& Nbsp; >>> từ persistent.mapping PersistentMapping nhập khẩu
& Nbsp; >>> db = DB ()
& Nbsp; >>> conn = db.open ()
& Nbsp; >>> root = conn.root ()
& Nbsp; >>> gốc ['ob1'] = PersistentMapping ()
& Nbsp; >>> gốc ['ob2'] = PersistentMapping ()
& Nbsp; >>> transaction.commit ()
Sau đó chúng ta sẽ tạo ra một số tài liệu tham khảo chính:
& Nbsp; >>> từ zope.keyreference.persistent KeyReferenceToPersistent nhập khẩu
& Nbsp; >>> Key1 = KeyReferenceToPersistent (root ['ob1'])
& Nbsp; >>> key2 = KeyReferenceToPersistent (root ['ob2'])
Chúng ta có thể gọi là chìa khóa để có được các đối tượng:
& Nbsp; >>> Key1 () là gốc ['ob1'], key2 () là gốc ['ob2']
& Nbsp; (True, True)
Phím mới với cùng một đối tượng đều bình đẳng cho người già:
& Nbsp; >>> KeyReferenceToPersistent (root ['ob1']) == Key1
& Nbsp; Đúng
và có băm cùng:
& Nbsp; >>> hash (KeyReferenceToPersistent (root ['ob1'])) == hash (Key1)
& Nbsp; Đúng
Triển khai tham chiếu quan trọng khác được khác biệt bởi kiểu id chính của họ. Tài liệu tham khảo quan trọng nên sắp xếp đầu tiên về loại chính của họ và thứ hai trên bất kỳ loại thông tin cụ thể:
& Nbsp; >>> từ zope.interface cụ nhập khẩu
& Nbsp; >>> từ zope.keyreference.interfaces nhập IKeyReference
& Nbsp; >>> class DummyKeyReference (object):
& Nbsp; ... cụ (IKeyReference)
& Nbsp; ... key_type_id = 'zope.app.keyreference.object'
& Nbsp; ... def __init __ (self, obj):
& Nbsp; ... self.object = obj
& Nbsp; ... def __cmp __ (self, khác):
& Nbsp; ... nếu self.key_type_id == other.key_type_id:
& Nbsp; ... trở cmp (self.object, other.object)
& Nbsp; ... trở cmp (self.key_type_id, other.key_type_id)
& Nbsp; >>> dummy_key1 = DummyKeyReference (đối tượng ())
& Nbsp; >>> dummy_key2 = DummyKeyReference (đối tượng ())
& Nbsp; >>> dummy_key3 = DummyKeyReference (đối tượng ())
& Nbsp; >>> phím = [Key1, dummy_key1, dummy_key2, key2, dummy_key3]
& Nbsp; >>> keys.sort ()
& Nbsp; >>> key_type_ids = [key.key_type_id cho khóa trong khóa]
& Nbsp; >>> key_type_ids [0: 3] .count ('zope.app.keyreference.object')
& Nbsp; 3
. & Nbsp; >>> key_type_ids [3:] đếm ('zope.app.keyreference.persistent')
& Nbsp; 2
Chúng tôi sẽ lưu trữ các tài liệu tham khảo quan trọng trong cơ sở dữ liệu:
& Nbsp; >>> gốc ['Key1'] = Key1
& Nbsp; >>> gốc ['key2'] = key2
và sử dụng các phím để lưu trữ các đối tượng một lần nữa:
& Nbsp; >>> gốc [Key1] = root ['ob1']
& Nbsp; >>> gốc [key2] = root ['ob2']
& Nbsp; >>> transaction.commit ()
Bây giờ chúng tôi sẽ mở một kết nối khác:
& Nbsp; >>> conn2 = db.open ()
Và xác minh rằng chúng ta có thể sử dụng các phím để tìm kiếm các đối tượng:
& Nbsp; >>> root2 = conn2.root ()
& Nbsp; >>> Key1 = root2 ['Key1']
& Nbsp; >>> root2 [Key1] là root2 ['ob1']
& Nbsp; Đúng
& Nbsp; >>> key2 = root2 ['key2']
& Nbsp; >>> root2 [key2] là root2 ['ob2']
& Nbsp; Đúng
và chúng ta cũng có thể gọi là chìa khóa để có được các đối tượng:
& Nbsp; >>> Key1 () là root2 ['ob1']
& Nbsp; Đúng
& Nbsp; >>> key2 () là root2 ['ob2']
& Nbsp; Đúng
Chúng tôi không thể có được những tài liệu tham khảo quan trọng cho một đối tượng mà đã chưa được lưu:
& Nbsp; >>> KeyReferenceToPersistent (PersistentMapping ())
& Nbsp; ... # doctest: + lược từ
& Nbsp; Traceback (cuộc gọi gần đây nhất cuối cùng):
& Nbsp; ...
& Nbsp; NotYet: ...
Lưu ý rằng chúng tôi nhận được một lỗi NotYet. Điều này cho thấy rằng chúng tôi có thể có thể để có được một tài liệu tham khảo quan trọng sau này.
Chúng tôi có thể nhận được tài liệu tham khảo cho các đối tượng chưa được lưu nếu họ có một bộ chuyển đổi để ZODB.interfaces.IConnection. Các phương pháp add vào kết nối sẽ được sử dụng để cung cấp cho các đối tượng một đối tượng id, mà có đủ thông tin để tính toán các tham chiếu. Để thấy điều này, chúng ta sẽ tạo ra một đối tượng phù hợp với IConnection một cách ngớ ngẩn:
& Nbsp; >>> nhập khẩu dai dẳng
& Nbsp; >>> từ ZODB.interfaces nhập IConnection
& Nbsp; >>> lớp C (persistent.Persistent):
& Nbsp; ... def __conform __ (self, iface):
& Nbsp; ... nếu iface là IConnection:
& Nbsp; ... trở conn2
& Nbsp; >>> ob3 = C ()
& Nbsp; >>> key3 = KeyReferenceToPersistent (ob3)
& Nbsp; >>> transaction.abort ()
Giải quyết xung đột
Trong thời gian giải quyết xung đột, như đã thảo luận trong ZODB / ConflictResolution.txt, tài liệu tham khảo cho các đối tượng persistent là thực sự thể hiện của ZODB.ConflictResolution.PersistentReference. Điều này là phù hợp trong hai cách cho KeyReferenceToPersistent. Đầu tiên, nó giải thích một sự tinh tế của các lớp: nó không kế thừa từ persistent.Persistent. Nếu nó đã làm, nó sẽ không có sẵn cho giải quyết xung đột, chỉ PersistentReference nó đứng-in.
Thứ hai, nó giải thích một số các mã trong các phương pháp __hash__ và __cmp__. Những phương pháp này không chỉ xử lý các đối tượng persistent.Persistent, nhưng đối tượng PersistentReference. Nếu không có hành vi này, các đối tượng, chẳng hạn như cổ điển ZODB BTrees, sử dụng KeyReferenceToPersistent như phím hoặc thiết lập các thành viên sẽ không thể giải quyết xung đột. Ngay cả với các mã đặc biệt, trong một số trường hợp, các KeyReferenceToPersistent sẽ từ chối để so sánh và băm trong giải quyết xung đột vì nó không đáng tin cậy có thể làm như vậy.
__hash__ sẽ làm việc tương đối hiếm trong giải quyết xung đột: chỉ để tham khảo multidatabase. Dưới đây là một vài ví dụ.
& Nbsp; >>> từ ZODB.ConflictResolution nhập PersistentReference
& Nbsp; nhà máy >>> def (ref):
& Nbsp; ... res = KeyReferenceToPersistent .__ mới __ (
& Nbsp; ... KeyReferenceToPersistent, ref)
& Nbsp; ... res.object = ref
& Nbsp; ... trở lại res
& Nbsp; ...
& Nbsp; >>> hash (nhà máy (PersistentReference (
& Nbsp; ... ('một oid', 'class metadata')))) # một tham chiếu điển hình
& Nbsp; Traceback (cuộc gọi gần đây nhất cuối cùng):
& Nbsp; ...
& Nbsp; ValueError: tên cơ sở dữ liệu không có sẵn tại thời điểm này
& Nbsp; >>> bool (hash (nhà máy (PersistentReference (
& Nbsp; ... ['m', ('một cơ sở dữ liệu', 'một oid', 'class metadata')])))) # multidatabase
& Nbsp; Đúng
Điều này có nghĩa rằng KeyReferenceToPersistent sẽ thường xuyên cản trở giải quyết xung đột cho các lớp học như PersistentMapping.
__cmp__ hoạt động trừ khi một đối tượng là một tài liệu tham khảo multidatabase và khác không. Dưới đây là một vài ví dụ.
& Nbsp; >>> cmp (nhà máy (PersistentReference (
& Nbsp; ... ('một oid', 'class metadata'))),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ('một oid', 'class metadata'))))
& Nbsp; 0
& Nbsp; >>> cmp (nhà máy (PersistentReference (
& Nbsp; ... ('một oid', 'class metadata'))),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ('khác oid', 'class metadata'))))
& Nbsp; -1
& Nbsp; >>> cmp (nhà máy (PersistentReference ('một oid')),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ('một oid', 'class metadata'))))
& Nbsp; 0
& Nbsp; >>> cmp (nhà máy (PersistentReference ('một oid')),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ('một oid', 'class metadata'))))
& Nbsp; 0
& Nbsp; >>> cmp (nhà máy (PersistentReference (
& Nbsp; ... ['m', ('một cơ sở dữ liệu', 'một oid', 'siêu dữ liệu lớp')])),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ['m', ('một cơ sở dữ liệu', 'một oid', 'class metadata')])))
& Nbsp; 0
& Nbsp; >>> cmp (nhà máy (PersistentReference (
& Nbsp; ... ['m', ('một cơ sở dữ liệu', 'một oid', 'siêu dữ liệu lớp')])),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ['n', ('một cơ sở dữ liệu', 'một oid')])))
& Nbsp; 0
& Nbsp; >>> cmp (nhà máy (PersistentReference (
& Nbsp; ... ['m', ('một cơ sở dữ liệu', 'một oid', 'siêu dữ liệu lớp')])),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ['m', ('một cơ sở dữ liệu', 'một oid', 'class metadata')])))
& Nbsp; -1
& Nbsp; >>> cmp (nhà máy (PersistentReference (
& Nbsp; ... ['m', ('một cơ sở dữ liệu', 'một oid', 'siêu dữ liệu lớp')])),
& Nbsp; ... Nhà máy (PersistentReference (
& Nbsp; ... ('một oid', 'class metadata'))))
& Nbsp; Traceback (cuộc gọi gần đây nhất cuối cùng):
& Nbsp; ...
& Nbsp; ValueError: không thể loại đáng tin cậy
Vị trí dựa trên kết nối bộ chuyển đổi
Các chức năng zope.keyreference.connectionOfPersistent thích nghi đối tượng để kết nối sử dụng một vị trí dựa trên Heuristic đơn giản. Nó kiểm tra để xem nếu đối tượng có một __parent__ rằng có một kết nối:
& Nbsp; >>> từ zope.keyreference.persistent connectionOfPersistent nhập khẩu
& Nbsp; >>> ob3 = PersistentMapping ()
& Nbsp; >>> print connectionOfPersistent (ob3)
& Nbsp; Không
& Nbsp; >>> ob3 .__ parent__ = root2 ['ob1']
& Nbsp; >>> connectionOfPersistent (ob3) là conn2
& Nbsp; Đúng

là gì mới trong phiên bản này:

  • kiểm tra Fix phá vỡ bởi việc loại bỏ các zope.testing từ phụ thuộc kiểm tra: tránh các module ZODB3 cần nó.

Yêu cầu :

  • Python

Phần mềm khác của nhà phát triển Zope Corporation and Contributors

zope.app.locales
zope.app.locales

14 Apr 15

zope.app.rotterdam
zope.app.rotterdam

14 Apr 15

zope.app.testing
zope.app.testing

14 Apr 15

zope.tal
zope.tal

11 May 15

Ý kiến ​​để zope.keyreference

Bình luận không
Nhập bình luận
Bật hình ảnh!