2012-08-29 13 views
7

मैं एक निपुणता ऑब्जेक्ट के सभी फ़ील्ड (और मान) को सूचीबद्ध करना चाहता हूं।एक निपुणता ऑब्जेक्ट के क्षेत्र सूचीबद्ध करें

मैं आसानी से इस myobject.myfield

की तरह एक भी क्षेत्र मूल्य तक पहुँच सकते हैं लेकिन मैं एक वस्तु की सभी उपलब्ध खाने की सूची के लिए कैसे पता नहीं है।

उत्तर

8

निपुणता वस्तुओं एक स्कीमा, जो गणनीय है द्वारा परिभाषित कर रहे:

from zope.interface.interfaces import IMethod 

for name, desc in IYourDexteritySchema.namesAndDescriptions(): 
    value = getattr(yourDexterityInstance, name) 
    if IMethod.providedBy(desc): 
     # It's a method, call it 
     value = value() 

यहाँ मैं .namesAndDescriptions() method उपयोग करें, लेकिन आप भी सिर्फ एक इटरेटर के रूप में इंटरफ़ेस का उपयोग कर सकते हैं अगर आप पर कोई तरीकों की जरूरत नहीं है अपने स्कीमा:

for name in IYourDexteritySchema: 
    value = getattr(yourDexterityInstance, name) 

इतना ही नहीं बल्कि, zope.schemagetFieldsInOrder नाम के एक उपयोगिता विधि है कि एक अंतरफलक में zope.schema खेतों पर फिल्टर करेगा है; ऊपर तरीकों में भी तरीके और गैर स्कीमा विशेषताओं की सूची बनाना, getFieldsInOrder केवल zope.schema विशिष्ट विशेषता प्रकार सूचीबद्ध करता है:

from zope.schema import getFieldsInOrder 

for name, field in getFieldsInOrder(IYourDexteritySchema): 
    value = getattr(yourDexterityInstance, name) 

यदि आप स्कीमा के माध्यम से-वेब, आप के लिए इंटरफ़ेस को देखने के लिए कैसे पता नहीं हो सकता अपने प्रकार। तुम भी कम के लिए फैक्टरी प्रकार सूचना, या FTI के माध्यम से स्कीमा इंटरफेस को पुनः प्राप्त कर सकते हैं:

from plone.dexterity.interfaces import IDexterityFTI 
from zope.component import getUtility 

schema = getUtility(IDexterityFTI, name='your.dexterity.type').lookupSchema() 

जहां schema अब अपनी इंटरफ़ेस रखती है।

+2

नोट: सभी उत्तर यहाँ केवल खेतों मुख्य अंतरफलक पर, नहीं दे फ़ील्ड जिन्हें व्यवहार द्वारा जोड़ा जा सकता है। दुर्भाग्यवश उनको प्रतिपादन प्रपत्रों के हिस्से के रूप में समझा जाता है, और वर्तमान में प्रपत्र प्रतिपादन प्रक्रिया के बाहर उन्हें गिनने का एक अच्छा तरीका नहीं है। –

0

आप वैकल्पिक रूप से FTI उपयोग कर सकते हैं:

from plone.dexterity.interfaces import IDexterityFTI 
from zope.component import getUtility 

fti = getUtility(IDexterityFTI, name='rgd.venues.venue') 
schema = fti.lookupSchema() 
fields = getFieldsInOrder(schema) 
for key, value in fields: 
    # so something 
+0

अच्छा, लेकिन फिर से: यह केवल स्कीमा फ़ील्ड के लिए काम करता है, व्यवहार –

3

मैं यह करने के लिए एक रास्ता मिल गया। चूंकि निपुणता योजना भिन्न होती है, इसलिए मैं सीधे क्रिस्टोफ सुझाव का उपयोग नहीं कर सका। लेकिन यह अब

for key, value in getFieldsInOrder(obj.getTypeInfo().lookupSchema()): 
    value = getattr(getattr(obj, key), 'output', getattr(obj, key)) 
5

काम करता है के रूप में डेविड बताया गया है, मैं व्यवहार से आने वाले क्षेत्रों की गणना करने के लिए एक रास्ता नहीं मिल सका।

तो, plone.dexterity की खुदाई, utils.getAdditionalSchemata समारोह में मैं मोटे तौर पर समस्या का समाधान करने के लिए इस रास्ता मिल गया:

from zope.schema import getFieldsInOrder 
from plone.behavior.interfaces import IBehaviorAssignable 

behavior_assignable = IBehaviorAssignable(context) 
if behavior_assignable: 
    behaviors = behavior_assignable.enumerateBehaviors() 
    for behavior in behaviors: 
    for k,v in getFieldsInOrder(behavior.interface): 
     # ... 
+1

ध्यान दें कि यह * केवल * व्यवहार प्राप्त करेगा, इसलिए आपको दोनों को करने की आवश्यकता है। :-) –