2011-10-13 21 views
6

मैं दो अनुप्रयोगों द्वारा उपयोग किए जाने वाले इंटरफ़ेस को लिख रहा हूं। इस इंटरफ़ेस को संचार करने के लिए कुछ DoSomethingRequest और DoSomethingResponse कक्षाओं का उपयोग करना चाहिए।पायथन मॉडल ऑब्जेक्ट सत्यापन

क्या कोई पुस्तकालय है जो कुछ मॉडल सत्यापन करता है, उदाहरण के लिए Django के Model?
वस्तु एक एक प्रकार str की "पाठ" संपत्ति(), प्रकार int (के एक "संख्या" संपत्ति), प्रकार का एक "आइटम" संपत्ति होना चाहिए:

मैं मूल रूप से कहने के लिए कुछ तरह सक्षम होना चाहते हैं सूची()। एक ड्रवाई तरीके से।

मैं निम्नलिखित की तरह कुछ के लिए देख रहा हूँ, या बेहतर:

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() 

मैं जानता हूँ कि मैं अपने ही लिख सकते हैं, लेकिन अगर उपलब्ध है, मैं थोड़ा के लिए नया हूँ मैं नहीं बल्कि एक पुस्तकालय का उपयोग करेंगे इस।

+0

यदि आप इसे पसंद करते हैं तो Django के ORM का उपयोग क्यों न करें? –

+1

@ क्रिस मॉर्गन: क्योंकि Django का ओआरएम रिलेशनल-विशिष्ट है, वहां कोई एंबेडेड मॉडल नहीं है। Django के ओआरएम में भी बहुत सी अतिरिक्त चीजें हैं जिनकी मुझे आवश्यकता नहीं है। – Prody

उत्तर

3

आप इंटरफेस लागू करने, या डिजाइन द्वारा अनुबंध उपयोग करना चाहते हैं के लिए, तो आप शायद zope.interface पुस्तकालय चाहते हैं। नाम के बावजूद, जो ज़ोप में अपनी उत्पत्ति को दर्शाता है, यह वास्तव में उस ढांचे से जुड़ा हुआ नहीं है और बाहर काफी उपयोग योग्य है।

+1

प्रोडी मुझे लगता है कि आप यही देख रहे हैं – llazzaro

2

मुझे लगता है कि इसके लिए सजावटी का उपयोग किया जा सकता है। जांच के लिए इस लिंक

Combining Descriptors with Class Decorators for Validation

एक अलग दृष्टिकोण check Duck typing

+1

मैंने पहले से ही ऐसा किया है, लेकिन मुझे वैल्यूएटर सेट करते समय मुझे संपत्ति के नाम को दोहराना पसंद नहीं है। – Prody

+0

बतख टाइपिंग के बारे में क्या? मुझे लगता है कि वस्तु उन्मुख तरीके से एक बेहतर दृष्टिकोण है। आप अपनी वस्तु के सही तरीके से उपयोग करने के लिए अन्य वस्तुओं में भरोसा करते हैं। यह एक अलग दृष्टिकोण है, आपके यकीन से नहीं कि आप इसे पसंद करेंगे या नहीं। – llazzaro

+0

मुझे बतख टाइपिंग पसंद है, लेकिन मुझे इस इंटरफ़ेस का उपयोग करने वाले लोगों को बताने का एक तरीका ढूंढना होगा कि "आइटम" को 'MyEmbeddedModelClass' – Prody

0

चूंकि पाइथन गतिशील है, इसलिए सम्मेलन को व्यवहार पर एक विशिष्ट प्रकार के उदाहरण के बजाय किसी विशेष वर्ग के उदाहरण की आवश्यकता होती है।

कहीं भी आपके कोड में, अधिमानतः उस बिंदु पर जहां आपको उन गुणों तक पहुंचने की आवश्यकता है, लेकिन जितनी जल्दी संभव हो सके कि ऑब्जेक्ट में उन गुण हैं और आगे यह कहते हैं कि वे गुण हैं जो आप उन्हें उम्मीद करते हैं।

यह एक AssertionError अपवाद को जन्म देती है, तो वस्तु o, प्रकार की परवाह किए बिना, यह 'someattribute' विशेषता याद आ रही है, तो:

assert(hasattr(o, 'someattribute')) 

इसके अलावा, अगर o.someattribute एक स्ट्रिंग नहीं है:

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

यह वही है जो मैं करने की कोशिश कर रहा हूं, लेकिन मैं इसे स्वचालित रूप से 'वैध (स्वयं) विधि में करना चाहता हूं। इस मामले में TextField/IntField/आदि वर्गों का उपयोग कर। – Prody

+0

सावधान रहें कि पाइथन को '' -O'' ध्वज के साथ कॉल करके, आवेषण अक्षम किया जा सकता है, इसलिए उन्हें प्रवाह नियंत्रण के लिए भरोसा नहीं किया जाना चाहिए! अपने कोड का परीक्षण करने के लिए बस उन्हें "अतिरिक्त चेक" के रूप में उपयोग करें .. – redShadow

संबंधित मुद्दे