2011-10-13 38 views
6

Tôi đang viết một giao diện được sử dụng bởi hai ứng dụng. Giao diện này nên sử dụng một số lớp học DoSomethingRequestDoSomethingResponse để thực hiện giao tiếp.Xác thực đối tượng mô hình Python

Có thư viện nào thực hiện một số xác thực mẫu, ví dụ như số Model của Django không?

Tôi về cơ bản muốn có thể nói điều gì đó như:
Đối tượng A phải có thuộc tính "văn bản" loại str(), thuộc tính "số" của loại int(), thuộc tính "mục" của loại danh sách(). Theo cách DRY.

Tôi đang tìm một cái gì đó như sau, hoặc tốt hơn:

class MyEmbeddedModelClass(EmbeddedModel): 
    text = TextField(required = True) 

class MyModel(Model): 
    text = TextField(required = True) 
    number = IntField(default = 0) 
    items = ListField(EmbeddedModel) 


a = MyModel() 
a.text = "aaaa" 
a.number = 1 
a.items = [ 
    MyEmbeddedModelClass("bbbb"), 
    MyEmbeddedModelClass("cccc"), 
    MyEmbeddedModelClass("dddd") 
] 
a.validate() 

Tôi biết tôi có thể viết riêng của tôi, nhưng tôi muốn sử dụng một thư viện nếu có, tôi là một chút mới điều này.

+0

Tại sao không sử dụng ORM của Django nếu bạn thích nó? –

+1

@ChrisMorgan: Bởi vì ORM của Django có liên quan cụ thể, không có EmbeddedModel. ORM của Django cũng có rất nhiều thứ mà tôi không cần. – Prody

Trả lời

3

Nếu bạn muốn thực thi các giao diện, hoặc sử dụng thiết kế theo hợp đồng, sau đó bạn có thể muốn thư viện zope.interface. Mặc dù tên, phản ánh nguồn gốc của nó trong Zope, nó không thực sự gắn liền với khuôn khổ đó và hoàn toàn có thể sử dụng bên ngoài.

+1

Prody Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm – llazzaro

2

Tôi nghĩ rằng trang trí có thể được sử dụng cho việc này. kiểm tra liên kết này

Combining Descriptors with Class Decorators for Validation

Đối với một cách tiếp cận khác nhau check Duck typing

+1

Tôi đã làm điều đó rồi, nhưng tôi không thích cách tôi phải lặp lại tên thuộc tính khi thiết lập trình xác nhận hợp lệ. – Prody

+0

Còn gõ vịt thì sao? Tôi nghĩ là một cách tiếp cận tốt hơn theo cách hướng đối tượng. Bạn dựa vào các đối tượng khác để sử dụng đúng cách đối tượng của bạn. đây là một cách tiếp cận khác, hơn bạn không chắc chắn nếu bạn sẽ thích nó. – llazzaro

+0

Tôi thích kiểu gõ vịt, nhưng tôi cần phải tìm cách để nói với mọi người sử dụng giao diện này rằng "các mặt hàng" được mong đợi là danh sách các kiểu chữ 'MyEmbeddedModelClass' – Prody

0

Vì python là động, quy ước là yêu cầu đối tượng xử lý như một phiên bản của một lớp cụ thể thay vì thực thi một loại cụ thể.

Một nơi nào đó trong mã của bạn, tốt nhất là tại thời điểm bạn cần truy cập các thuộc tính đó, nhưng càng sớm càng tốt khẳng định rằng đối tượng có các thuộc tính đó và xác nhận thêm rằng các thuộc tính đó là những gì bạn mong đợi.

Điều này đặt ra một ngoại lệ AssertionError nếu đối tượng o, bất kể loại, nếu nó thiếu phần 'someattribute' thuộc tính:

assert(hasattr(o, 'someattribute')) 

Hơn nữa, nếu o.someattribute không phải là một chuỗi:

assert(isinstance(o.someattribute, basestring)) 
+0

Đây chính xác là những gì tôi đang cố gắng làm, nhưng tôi muốn làm điều đó trong một phương thức 'validate (self)' tự động. Trong trường hợp này, sử dụng các lớp TextField/IntField/etc. – Prody

+0

Hãy coi chừng rằng các xác nhận có thể bị tắt, bằng cách gọi Python bằng cờ '' -O'', vì vậy chúng không nên dựa vào điều khiển luồng! Chỉ cần sử dụng chúng như là "kiểm tra thêm" để kiểm tra mã của bạn .. – redShadow

Các vấn đề liên quan