2013-02-21 51 views
26

तो यह एक साधारण सवाल है। अजगर में जब मॉड्यूल आयात करने, इस के बीच अंतर क्या है:पायथन मॉड्यूल आयात: सिंगल-लाइन बनाम मल्टी-लाइन

from module import a, b, c, d 

और इस

from module import a 
from module import b 
from module import c 
from module import d 
मेरे लिए

यह हमेशा समझ में आता है कोड को संक्षिप्त करने और पहला उदाहरण का उपयोग करने के लिए, लेकिन मैं देख रहा है वहां कुछ कोड नमूने दूसरे स्थान पर चले गए। क्या कोई फर्क नहीं पड़ता है या यह प्रोग्रामर की वरीयता में है?

+1

पहले कभी तो थोड़ा तेज दुभाषिया कार्यान्वयन पर निर्भर करता है हो सकता है, मुझे लगता है, लेकिन मैं नहीं कर सकता वास्तव में किसी अन्य तरीके से सोचें कि वे एक भाषा उपयोगकर्ता के परिप्रेक्ष्य से अलग होंगे। –

उत्तर

49

कोई फर्क नहीं पड़ता। वे दोनों बिल्कुल वही काम करते हैं।

हालांकि, एक स्टाइलिस्ट परिप्रेक्ष्य से, एक दूसरे की तुलना में अधिक बेहतर हो सकता है। और उस नोट पर, PEP-8 for imports का कहना है कि आप एक ही लाइन पर from module import name1, name2 सेक और एकाधिक पंक्तियों में import module1 छोड़ देना चाहिए:

Yes: import os 
    import sys 

No: import sys, os 

Ok: from subprocess import Popen, PIPE 

@ teewuane की टिप्पणी (यहाँ दोहराया मामले में टिप्पणी को हटा दिया जाता है) के जवाब में:

@ इंस्पेक्टर G4dget क्या होगा यदि आपको मॉड्यूल से कई फ़ंक्शन आयात करना है और यह उस पंक्ति को 80 से अधिक लंबा बना देता है? मुझे पता है कि 80 चार चीजें "जब यह कोड को और अधिक पठनीय बनाता है" लेकिन मैं अभी भी सोच रहा हूं कि ऐसा करने के लिए एक और अधिक आसान तरीका है या नहीं। और मैं foo आयात से नहीं करना चाहता हूं * भले ही मैं मूल रूप से सबकुछ आयात कर रहा हूं।

यहां मुद्दा यह है कि ऐसा कुछ कर रही वर्ण सीमा 80 पार कर सकते हैं निम्नलिखित:

from module import func1, func2, func3, func4, func5 
इस के लिए

, मैं दो प्रतिक्रियाओं है (मैं PEP8 इस बारे में बहुत ज्यादा स्पष्ट किया जा रहा है नहीं दिख रहा है) :

तोड़ इसे दो आयात में:

from module import func1, func2, func3 
from module import func4, func5 

ऐसा करने से नुकसान होता है कि अगर module को कोडबेस से हटा दिया गया है या अन्यथा रिफैक्टर किया गया है, तो दोनों आयात लाइनों को हटा दिया जाना चाहिए। इस दर्दनाक होने की

स्प्लिट लाइन साबित हो सकता है:

ऊपर चिंता को कम करने के लिए, यह

from module import func1, func2, func3, \ 
    func4, func5 

यह एक त्रुटि में परिणाम होगा अगर दूसरी पंक्ति है ऐसा करने के लिए समझदार हो सकता है पहले के साथ हटाया नहीं गया है, जबकि अभी भी एकवचन आयात विवरण

+0

मुझे लगता है कि यह मामला था। प्रोग्रामर की आंखों में सब कुछ। मैं कभी भी एकल लाइन मॉड्यूल मुद्दों के बारे में नहीं जानता था, हालांकि, मैं हर जगह इसका उपयोग करता हूं, कुछ बदलाव करने की आवश्यकता होती है। धन्यवाद! –

+4

@ कोडीब्राउन: 'सिंगल लाइन समस्याएं' <- वे वास्तव में समस्या नहीं हैं; शैली गाइड की तरह अधिक। उनका पालन करने के लिए बिल्कुल कोई जनादेश नहीं है। आप एक ऐसी टीम पर काम कर रहे हैं जो एक पूरी तरह से अलग स्टाइल गाइड का उपयोग करता है, जिस स्थिति में पीईपी -8 पूरी तरह से अनुपयोगी हो जाता है – inspectorG4dget

+1

@ इंस्पेक्टर जी 4 डीजेट क्या होगा यदि आपको एक मॉड्यूल से कई फ़ंक्शन आयात करना है और यह उस पंक्ति को 80 से अधिक लंबा बना देता है? मुझे पता है कि 80 चार चीजें "जब यह कोड को और अधिक पठनीय बनाता है" लेकिन मैं अभी भी सोच रहा हूं कि ऐसा करने के लिए एक और अधिक आसान तरीका है या नहीं। और मैं मूल रूप से सबकुछ आयात कर रहा हूं, भले ही मैं foo import * से नहीं करना चाहता हूं। – teewuane

15

inspectorG4dget's answer से उठाए गए कुछ प्रश्नों को जोड़ने के लिए, आप बहु-पंक्ति करने के लिए टुपल्स का भी उपयोग कर सकते हैं आयात जब फ़ोल्डर संरचनाओं को गहरा घोंसला मिलना शुरू हो जाता है या आपके पास नामों के नाम के साथ मॉड्यूल होते हैं।

from some.module.submodule.that_has_long_names import (
    first_item, 
    second_item, 
    more_imported_items_with_really_enormously_long_names_that_might_be_too_descriptive, 
    that_would_certainly_not_fit, 
    on_one_line, 
) 

यह भी काम करता है, हालांकि मैं इस शैली का एक प्रशंसक नहीं हूँ:

from module import (a_ton, of, modules, that_seem, to_keep, needing, 
        to_be, added, to_the_list, of_required_items) 
+0

व्यक्तिगत रूप से, मुझे यह मेरी व्यक्तिगत पसंदीदा शैली के रूप में मिलता है। इसे लाइन ब्रेक या रिडंडेंसी से बचने की आवश्यकता नहीं है – codeblooded