2010-05-31 14 views
6

कोडिंग मैंने अभी यूनी लर्निंग पायथन में अंतिम अर्ध सेमेस्टर बिताया है। मैंने वास्तव में इसका आनंद लिया है, और कुछ 'पायथनिक' कोड लिखने के बारे में कुछ सुझावों की उम्मीद कर रहा था।पाइथन मार्ग

यह हाल ही में किए गए असाइनमेंट से __init__ वर्ग है। जब मैंने इसे लिखा था, तो मैं काम करने की कोशिश कर रहा था कि मैं इसे लैम्ब्स, या एक स्वच्छ, अधिक कुशल तरीके से कैसे लिख सकता हूं, लेकिन समय से बाहर भाग गया।

def __init__(self, dir): 

    def _read_files(_, dir, files): 

     for file in files: 

      if file == "classes.txt": 
       class_list = readtable(dir+"/"+file) 
       for item in class_list: 
        Enrol.class_info_dict[item[0]] = item[1:] 
        if item[1] in Enrol.classes_dict: 
         Enrol.classes_dict[item[1]].append(item[0]) 
        else: 
         Enrol.classes_dict[item[1]] = [item[0]] 

      elif file == "subjects.txt": 
       subject_list = readtable(dir+"/"+file) 
       for item in subject_list: 
        Enrol.subjects_dict[item[0]] = item[1] 

      elif file == "venues.txt": 
       venue_list = readtable(dir+"/"+file) 
       for item in venue_list: 
        Enrol.venues_dict[item[0]] = item[1:] 

      elif file.endswith('.roll'): 
       roll_list = readlines(dir+"/"+file) 
       file = os.path.splitext(file)[0] 
       Enrol.class_roll_dict[file] = roll_list 
       for item in roll_list: 
        if item in Enrol.enrolled_dict: 
         Enrol.enrolled_dict[item].append(file) 
        else: 
         Enrol.enrolled_dict[item] = [file] 


    try: 
     os.path.walk(dir, _read_files, None) 
    except: 
     print "There was a problem reading the directory" 

जैसा कि आप देख सकते हैं, यह थोड़ा भारी है। अगर किसी के पास समय या झुकाव है, तो मैं वास्तव में कुछ पायथन सर्वोत्तम प्रथाओं पर कुछ सुझावों की सराहना करता हूं।

धन्यवाद।

+0

नोट: यह 'एनरोल' नामक एक मॉड्यूल का हिस्सा था, जिसमें 'एनरोल' वर्ग होता है जिसके लिए यह '__init__' –

+3

लगता है जैसे आपको सहपाठी मिलती है: http://stackoverflow.com/questions/2943396/python -need-some-help –

+1

यह देखो एस * उल्लेखनीय * जैसे http://stackoverflow.com/questions/2943396/python-need-some-help – Johnsyweb

उत्तर

5

युगल चीजें हैं जो अपने कोड थोड़ा साफ कर सकते हैं:

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

Enrol.venues_dict.setdefault(key, []).append(file) 

>>> x = {} 
>>> x.setdefault(99, []).append(5) 
>>> x.setdefault(99, []).append(6) 
>>> x 
{99: [5, 6]} 
>>> x.setdefault(100, []).append(1) 
>>> x 
{99: [5, 6], 100: [1]} 

अन्य संभावना फाइल पथ बनाने के लिए os.path.join का उपयोग करना है। स्ट्रिंग कॉन्सटेनेशन करने से यह सुरक्षित है।

os.path.join(dir, file) 

इसके अलावा, शैली, आईएमओ के मामले में अच्छा दिखता है।

+0

धन्यवाद, यह/elif लागू करने का एक बहुत ही साफ तरीका है। –

2

एक अन्य महत्वपूर्ण बिंदु आप (कुछ बहुत लंबे समय कहते हैं) नए कोड में पदावनत कार्यों का उपयोग नहीं करने के लिए है लंबे समय के लिए आप स्क्रिप्ट का उपयोग करना चाहते हैं:

os.path.walk अजगर 3.x. में गायब अब आप इसके बजाय os.walk का उपयोग कर सकते हैं। हालांकि os.walkos.path.walk से अलग है: यह अपने हस्ताक्षर में प्रसंस्करण कार्य को स्वीकार नहीं करता है। तो आपके कोड को दोबारा बदलना नाम बदलने से थोड़ा अधिक होगा।

+0

धन्यवाद joaquin। किसी और ने इंगित किया कि एक और पोस्ट में मेरे पास। दोबारा, मेरे पास इसे सबमिट करने से पहले इसे बदलने का समय नहीं था, लेकिन मैं अब उस पर एक नज़र डालेगा। –

3

orangeoctopus के सुझावों के अलावा setdefault का उपयोग करने के लिए आपको refactor कर सकते हैं अगर-बाकी एक डिस्पैचर में (बड़ा अगर-बाकी और स्विच बयान के लिए विशिष्ट प्रतिस्थापन):

# list of 2-tuples: (bool func(string filename), handler_function) 
handlers = [ 
    ((lambda fn: fn == "classes.txt"), HandleClasses), 
    ((lambda fn: fn == "subjects.txt"), HandleSubjects), 
    ((lambda fn: fn.endswith(".roll")), HandleRoll) 
] 

तो

for filename in files: 
    for matcher, handler in handlers: 
    if matcher(filename): 
     handler(filename) 
     break 
+1

वाह, वह महान! मैं एक बड़ा और अन्य विकल्प बदलने के लिए देख रहा था, और कुछ पाया, लेकिन यह कुछ भी साफ नहीं है। पाइथन बस बेहतर और बेहतर हो रहा है;) धन्यवाद रिचर्ड! –

+0

बस स्पष्ट करने के लिए, 'हैंडल क्लासेस', 'हैंडलब्यूजेक्ट्स' आदि एक 'फ़ाइल नाम' पैरामीटर के साथ काम कर रहे हैं? और मुझे अभी भी 'dread' var तक पहुंचने के लिए '_read_files' फ़ंक्शन में परिभाषित करने की आवश्यकता होगी? –

+1

हाँ, सही।आपको उन्हें किसी जगह को परिभाषित करने की आवश्यकता होगी जहां उन प्रतीकों को परिभाषित किया गया है। आप इसे '__init__' में 'self.HandlerSubjects' के रूप में भी कर सकते हैं। –

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