2012-12-13 12 views
9

मैं अपने कोड में निम्नलिखित का उपयोग कर:IPython कस्टम dict वर्ग के लिए टैब पूरा होने

class Structure(dict,object): 
""" A 'fancy' dictionary that provides 'MatLab' structure-like 
referencing. 

""" 
def __getattr__(self, attr): 
    # Fake a __getstate__ method that returns None 
    if attr == "__getstate__": 
     return lambda: None 
    return self[attr] 

def __setattr__(self, attr, value): 
    self[attr] = value 

def set_with_dict(self, D): 
    """ set attributes with a dict """ 
    for k in D.keys(): 
     self.__setattr__(k, D[k]) 
सब यह मेरी प्रयोजनों के लिए काम करता है में

सभी, लेकिन मैंने देखा है कि एक ही रास्ता टैब पूरा होने से काम करता है के लिए है संरचना से विरासत में प्राप्त एक और कस्टम वर्ग में विधियों, और विशेषताओं के लिए नहीं। मैं भी इस परीक्षण किया है, और मैं परिणाम एक छोटे से अजीब लगता है:

In [2]: d = Structure() 
In [3]: d.this = 'that' 
In [4]: d.this 
Out[4]: 'that' 
In [5]: d.th<tab> 
NOTHING HAPPENS 

In [6]: class T(): 
    ...:  pass 
    ...: 

In [7]: t = T() 
In [8]: t.this = 'cheese' 
In [9]: t.th<tab> 
COMPLETES TO t.this 
Out[9]: 'cheese' 

मुझे अपने वर्ग में जोड़ने के लिए टैब पूरा होने विशेषताओं के लिए काम करने के लिए प्राप्त करने के लिए की आवश्यकता होगी?

+0

आप इसे करने के अलावा * में, डॉट पहुँच * * के बजाय ब्रैकेट अनुक्रमण चाहते नहीं * हैं, आप बस 'ऑब्जेक्ट' के खाली उप-वर्ग का उपयोग कर सकते हैं। पाइथन ऑब्जेक्ट्स डिफ़ॉल्ट रूप से "खुले" होते हैं। 'x.set_with_dict()' को 'x .__ dict __। अद्यतन()' – millimoose

+0

के साथ प्रतिस्थापित किया जा सकता है इसके अलावा, 'dict' और' ऑब्जेक्ट 'दोनों से विरासत में अनावश्यक है, क्योंकि 'dict' (और अधिकांश मानक लाइब्रेरी कक्षाएं) नई- स्टाइल क्लास और पहले से ही 'ऑब्जेक्ट' से प्राप्त होता है। – millimoose

+0

एकाधिक विरासत के बारे में अच्छी बात है। हालांकि, मैं _both_ ब्रैकेट और मेरी कुंजी पर डॉट पहुंच प्राप्त करना चाहता हूं। मैं एक शुद्ध पायथन निर्देश का उपयोग करने के लिए अपना कोड स्विच करने की कोशिश कर रहा हूं, लेकिन अभी भी कुछ जगहें हैं जो डॉट एक्सेस पर भरोसा करती हैं ... – John

उत्तर

13

इस विधि जोड़ें:

def __dir__(self): 
    return self.keys() 

यहाँ देखें: http://ipython.org/ipython-doc/dev/config/integrating.html

और यहाँ: http://docs.python.org/2/library/functions.html

+0

धन्यवाद मालसाइड! मुझे अपनी पिछली खोजों में जानकारी का टुकड़ा याद नहीं आया (सुनिश्चित नहीं है)! – John

+0

नए आईपैथॉन में, टैब पूर्ण होने वाली विंडो में स्क्रॉलिंग के साथ प्रविष्टियों की अधिकतम संख्या होती है। किसी को पता है कि इसे कैसे समायोजित करें? – mathtick

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