2012-02-14 15 views
5

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

IFA_UNSPEC  = 0 
IFA_ADDRESS = 1 
IFA_LOCAL  = 2 
IFA_LABEL  = 3 
IFA_BROADCAST = 4 
IFA_ANYCAST = 5 
IFA_CACHEINFO = 6 
IFA_MULTICAST = 7 

इसकी जब structs निर्माण गिरी को भेजने के लिए इन मानों का उपयोग करने के लिए आसान। हालांकि, वे कर्नेल से प्रतिक्रियाओं में मानों को हल करने के लिए लगभग कोई मदद नहीं कर रहे हैं।

यदि मैं मूल्यों को निर्देश में डालता हूं तो मुझे कर्नेल में प्रत्येक संरचना में प्रत्येक आइटम के लिए प्रत्येक कुंजी के लिए कुंजी देखने के लिए निर्देश में सभी मूल्यों को स्कैन करना होगा। एक सरल, अधिक कुशल तरीका होना चाहिए।

आप यह कैसे करेंगे? (प्रश्न retitle के लिए स्वतंत्र महसूस अगर अपनी तरह से बंद)

+1

2 डिक्ट्स बनाएं, प्रत्येक दिशा में एक मैप किया गया हो सकता है? यदि आपके मैपिंग बदलने की संभावना नहीं है तो यह प्रभावी होगा। –

+0

मुझे लगता है कि आप जो पूछते हैं उसका उत्तर यहां दिया गया है http://stackoverflow.com/questions/3318625/efficient-bidirectional-hash-table-in-python। यदि आप सिर्फ पाइथोनिक चाहते हैं, तेज़ नहीं: फ़िल्टर (लैम्ब्डा के: ए [के] == 3, ए) आपको IFA_LABEL –

+1

@ जोएल कॉर्नेट देता है: कृपया अपना उत्तर उत्तर के रूप में पोस्ट करें ताकि इसे ठीक से वोट दिया जा सके। –

उत्तर

9

आप दो dicts का उपयोग करना चाहते हैं, तो आप उल्टे dict बनाने के लिए इस कोशिश कर सकते हैं:

b = {v: k for k, v in a.iteritems()} 
+0

जब मूल्य अद्वितीय नहीं होते हैं तो यह बड़ी समस्याएं पैदा करता है। हालांकि, सवाल से, ऐसा प्रतीत होता है कि मूल्य अद्वितीय होने की संभावना है। इसलिए, यह एक शब्दकोश कन्स्ट्रक्टर का एक सुरुचिपूर्ण उपयोग है। एक के लिए 'dict (कुछ [के], के) से कुछ हद तक क्लीनर ए)'। –

1

क्या मैं कर रहा निरंतर जा रहा है समाप्त हो गया मॉड्यूल में मूल्य और एक नियम बनाते हैं। मॉड्यूल ip_addr.py है (मान linux/if_addr.h से हैं) इसलिए कर्नेल को भेजने के लिए structs का निर्माण करते समय मैं if_addr.IFA_LABEL का उपयोग कर सकता हूं और if_addr.values[2] के साथ प्रतिक्रिया हल करता हूं। मैं आशा करती हूं यह सबसे सीधे आगे इतना है कि जब मैं एक साल में फिर से इसे देखो करने के लिए है + अपनी समझने में आसान: p

IFA_UNSPEC  = 0 
IFA_ADDRESS = 1 
IFA_LOCAL  = 2 
IFA_LABEL  = 3 
IFA_BROADCAST = 4 
IFA_ANYCAST = 5 
IFA_CACHEINFO = 6 
IFA_MULTICAST = 7 
__IFA_MAX  = 8 

values = { 
      IFA_UNSPEC : 'IFA_UNSPEC', 
      IFA_ADDRESS : 'IFA_ADDRESS', 
      IFA_LOCAL  : 'IFA_LOCAL', 
      IFA_LABEL  : 'IFA_LABEL', 
      IFA_BROADCAST : 'IFA_BROADCAST', 
      IFA_ANYCAST : 'IFA_ANYCAST', 
      IFA_CACHEINFO : 'IFA_CACHEINFO', 
      IFA_MULTICAST : 'IFA_MULTICAST', 
      __IFA_MAX  : '__IFA_MAX' 
     } 
2

आपका समाधान बहुत काम छोड़ देता है फ़ाइल बनाने दोहराया व्यक्ति से करते हैं। यह त्रुटि का स्रोत है (आपको वास्तव में प्रत्येक बार तीन बार लिखना होगा)। अगर आपके पास एक फ़ाइल है जहां आपको समय-समय पर अपडेट करने की आवश्यकता है (जैसे, जब नई कर्नेल रिलीज आती है), तो आप जल्द या बाद में एक त्रुटि शामिल करने के लिए नियत हैं। असल में, यह कहने का एक लंबा रास्ता था, आपका समाधान DRY का उल्लंघन करता है।

मैं कुछ इस तरह करने के लिए अपने समाधान बदल जाएगा:

IFA_UNSPEC  = 0 
IFA_ADDRESS = 1 
IFA_LOCAL  = 2 
IFA_LABEL  = 3 
IFA_BROADCAST = 4 
IFA_ANYCAST = 5 
IFA_CACHEINFO = 6 
IFA_MULTICAST = 7 
__IFA_MAX  = 8 

values = {globals()[x]:x for x in dir() if x.startswith('IFA_') or x.startswith('__IFA_')} 

यह values dict स्वचालित रूप से उत्पन्न होता है था। उस फ़ाइल में जो कुछ भी है, उसके अनुसार आप if कथन में स्थिति को बदलना (या करना) करना चाहते हैं। शायद कुछ की तरह कुछ। वह संस्करण अगर कथन में उपसर्ग सूचीबद्ध करने की आवश्यकता को दूर करेगा, लेकिन अगर आपके पास फ़ाइल में अन्य सामान था तो यह असफल हो जाएगा।

values = {globals()[x]:x for x in dir() if not x.endswith('__')} 

आप निश्चित रूप से कुछ और परिष्कृत कर सकते हैं, उदा। गलती से दोहराए गए मूल्यों की जांच करें।

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