2009-05-05 8 views
12

में यम विलय हो रहा है, इसलिए मैं खुद को बनाने के विचार के साथ चारों ओर झुका रहा हूं (और जो भी इसे निश्चित रूप से उपयोग करने की परवाह करता है) पायगोन के लिए पायथन में एक छोटी बॉयलरप्लेट लाइब्रेरी। मुझे एक ऐसी प्रणाली चाहिए जहां आवेदन के लिए सेटिंग्स को यमल फ़ाइल के साथ प्रदान किया जाता है।पाइथन

तो मैं सोच रहा था कि पुस्तकालय एक डिफ़ॉल्ट यमल पेड़ प्रदान करता है और इसे एक उपयोगकर्ता द्वारा प्रदान किए गए उपयोगकर्ता के साथ विलय कर लेता है। प्रयोज्यता के लिए मुझे आश्चर्य है कि यदि संभव हो तो वहां कोई भी व्यक्ति है जो दिव्य दिनचर्या कर सकता है:

पेड़ में किसी भी मामले में जहां उपयोगकर्ता ने यमल को डिफ़ॉल्ट रूप से ओवरलैप किया है, तो उपयोगकर्ता ने आपूर्ति की गई लाइब्रेरी को पुस्तकालय की आपूर्ति की जगह दी है।

किसी भी मामले में जहां उपयोगकर्ता ने yaml की आपूर्ति की है, डिफ़ॉल्ट पेड़ को ओवरलैप नहीं करता है, तो डिफ़ॉल्ट पेड़ बनी रहती है।

उपयोगकर्ता द्वारा प्रदान किए गए पेड़ में उपलब्ध किसी भी सुपरफ्लस शाखाओं को जोड़ा जाता है।

मुझे पता है कि यह स्पष्टीकरण वर्बोज़ था क्योंकि यह शायद स्पष्ट है कि मैं क्या पूछ रहा हूं। मुझे आश्चर्य है कि यह मुफ्त में पाने के लिए थोड़ा सा है।

+0

यह विवादित प्रकारों को कैसे प्रबंधित करना चाहिए, जैसे डिफ़ॉल्ट पेड़ में एक सूची, और कॉन्फ़िगर पेड़ में एक शब्दकोश? क्या इसे सूचियों को मर्ज करना चाहिए, और उस स्थिति में, कैसे? –

उत्तर

21

आप फ़ाइलों को पार्स करने PyYAML इस्तेमाल कर सकते हैं, और फिर निम्न समारोह दो पेड़ों विलय करने के लिए: इस कार्यप्रणाली को कॉल करने से पहले

def merge(user, default): 
    if isinstance(user,dict) and isinstance(default,dict): 
     for k,v in default.iteritems(): 
      if k not in user: 
       user[k] = v 
      else: 
       user[k] = merge(user[k],v) 
    return user 

वैकल्पिक रूप से, आप उपयोगकर्ता के पेड़ की एक deep-copy कर सकता है।

+0

उपयोगकर्ता.अपडेट (डिफ़ॉल्ट) क्यों नहीं? –

+0

यह डिफ़ॉल्ट है। अपडेट (उपयोगकर्ता), क्योंकि dict.update मौजूदा कुंजी ओवरराइट करता है। यह जानने के लिए कि पेड़ में गहराई से कहां जाना है, मुझे शामिल शब्दकोश पर फिर से शुरू करना होगा, जो कि उपयोगकर्ता के सबसे बड़े और डिफ़ॉल्ट के बराबर या बराबर है। –

+2

बहुत अच्छा, धन्यवाद! हालांकि imho यह सरणी के बीच विलय को याद करता है: यदि एक कुंजी [1,2] है और दूसरी कुंजी [2,3] है, विलय तत्व [1,2,3] होना चाहिए। क्या मै गलत हु? – Riccardo