2010-08-26 8 views
13

के लिए पाइथन में मॉड्यूल आयात मैपिंग मेरे पास पाइथन मॉड्यूल का एक गुच्छा है जिसे मैं साफ करना, पुनर्गठित करना और रिफैक्टर करना चाहता हूं (कुछ डुप्लिकेट कोड, कुछ अप्रयुक्त कोड ...) है, और मुझे आश्चर्य है कि कोई उपकरण है या नहीं कौन सा मॉड्यूल का नक्शा बनाने के लिए अन्य मॉड्यूल का उपयोग करता है।आसान रिफैक्टरिंग

आदर्श रूप में, मैं इस तरह एक नक्शा करना चाहते हैं:

main.py 
-> task_runner.py 
    -> task_utils.py 
    -> deserialization.py 
    -> file_utils.py 
-> server.py 
    -> (deserialization.py) 
    -> db_access.py 

checkup_script.py 
re_test.py 
main_bkp0.py 
unit_tests.py 

... ताकि मैं बता सकते हैं जो फ़ाइलों को मैंने पहली बार इधर-उधर जाने (file_utils.py, db_access.py) है, जो फ़ाइलें शुरू कर सकते हैं मेरे main.py द्वारा उपयोग नहीं किया जा सकता है और इसलिए हटाया जा सकता है, आदि। (मैं वास्तव में लगभग 60 मॉड्यूल के साथ काम कर रहा हूं)

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

क्या आप किसी भी उपकरण (यहां तक ​​कि सरल स्क्रिप्ट) के बारे में जानते हैं जो कोड पुनर्गठन में सहायता करते हैं?

क्या आप जो करने की कोशिश कर रहे हैं उसके लिए आपको एक और सटीक शब्द पता है? कोड पुनर्गठन?

उत्तर

14

पायथन का modulefinder ऐसा करता है। एक स्क्रिप्ट लिखना काफी आसान है जो इस जानकारी को एक आयात ग्राफ में बदल देगा (जिसे आप graphviz के साथ प्रस्तुत कर सकते हैं): यहां clear explanation है। वहाँ भी (भी और ASTs का उपयोग कर!) है snakefood जो आप के लिए सब काम करता

आप और अधिक सामान्य रखरखाव कार्यों के लिए pylint या pychecker में देखना चाहते हो सकता है।

+1

मैं snakefood का पता नहीं था, धन्यवाद लिंक के लिए बहुत कुछ। +1 –

+1

धन्यवाद! मैं उस मानचित्र को प्राप्त करने में कामयाब रहा जिसे मैं आपके द्वारा भेजे गए स्पष्टीकरण में कोड को चुराकर चुरा रहा था और इसे तब तक पोक कर रहा था जब तक मुझे मुझे आवश्यक ग्राफ नहीं मिला। मैंने उन मॉड्यूल को सूचीबद्ध करने के लिए मॉड्यूलफाइंडर का भी उपयोग किया जो मैं नहीं कर रहा था (आधा से अधिक), इसलिए मैं सिर्फ nuke'em और उनके बारे में और नहीं सोच सकता था। मुझे भी पिलिंट मिला, लेकिन अभी तक इसके साथ बहुत कुछ नहीं खेला। – Emile

4

एक स्क्रिप्ट (हालांकि अलग-अलग वाक्यविन्यास आयात संभाल करने के लिए कर रहे हैं) है कि करता है यह शायद बहुत जटिल नहीं है,

लेखन यह तुच्छ है। import और from module import है। संभाल करने के लिए दो वाक्यविन्यास।

क्या आप जो करने की कोशिश कर रहे हैं उसके लिए आपको एक और सटीक शब्द पता है? कोड पुनर्गठन?

डिज़ाइन। इसे डिजाइन कहा जाता है। हाँ, यदि आप एक मौजूदा डिजाइन पुनर्रचना कर रहे हैं, लेकिन ...

नियम एक

तुम्हारे पास क्या है के साथ एक डिजाइन प्रयास प्रारंभ न करें। यदि आप करते हैं, तो आप केवल छोटे और कभी-कभी अपरिहार्य परिवर्तन करने वाले "किनारों के चारों ओर घूमते हैं"।

नियम दो

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

नियम तीन

जमीन से डिजाइन अप (या नए सिरे से के रूप में कुछ लोगों का कहना है) सही पैकेज और मॉड्यूल वास्तुकला के साथ।

इसके लिए एक अलग परियोजना बनाएं।

नियम चार

टेस्ट पहले। अपने नए वास्तुकला के लिए इकाई परीक्षण लिखें। यदि आपके पास मौजूदा यूनिट परीक्षण हैं, तो उन्हें नई परियोजना में कॉपी करें। नए वास्तुकला को प्रतिबिंबित करने के लिए आयात को संशोधित करें और अपने शानदार नए सरलीकरण को व्यक्त करने के लिए परीक्षणों को फिर से लिखें।

सभी परीक्षण विफल हो गए हैं, क्योंकि आपने कोई कोड नहीं ले लिया है। ये अच्छी बात है।

नियम पांच नई संरचना पिछले में

ले जाएँ कोड। परीक्षण पास होने पर कोड को रोकना बंद करें।

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

तो कोड को स्थानांतरित करने के लिए एक से आग्रह करता हूं लग रहा है, तुम बहुत अनुशासित किया जाना चाहिए। (1) आपके पास परीक्षण (ओं) होना चाहिए जो असफल हो और फिर (2) आप असफल परीक्षण पास करने के लिए कुछ कोड ले जा सकते हैं।

+1

+1। और एक प्रकार के रूप में 'submod' के रूप में आयात मॉड्यूल.submod आयात मत भूलना। यह मुझ पर बढ़ रहा है। – aaronasterling

+0

@Aaronasterling: अभी भी 'r" \ s * आयात \ s +। * * "जैसा दिखता है। –

+0

स्क्रैच से पुनर्लेखन अक्सर व्यावहारिक नहीं होता है, और ड्यूक नुकेम हमेशा के लिए सिंड्रोम का कारण बन सकता है। – Antimony

2

chuckmove एक उपकरण आपको रिकर्सिवली अपने पूरे स्रोत पेड़ में आयात पुनर्लेखन एक मॉड्यूल का एक नया स्थान का संदर्भ देने की सुविधा देता है।

chuckmove --old sound.utils --new media.sound.utils src 

... इस src में उतरता है, और बयान है कि sound.utils आयात बजाय media.sound.utils आयात करने के लिए पुनर्लेखन। यह पायथन आयात प्रारूपों की पूरी श्रृंखला का समर्थन करता है। अर्थात। from x import y, import x.y.z as w आदि