2016-09-12 8 views
5

एकाधिक पैरामीटर के साथ एक विधि के लिए फांसी इंडेंट के लिए उचित वाक्यविन्यास क्या है और संकेत संकेत टाइप करें?पाइथन में टाइप संकेत के साथ इंडेंट लटकाने के लिए इंडेंट का उचित स्तर क्या है?

पहले पैरामीटर के तहत संरेखित

def get_library_book(self, 
        book_id: str, 
        library_id: str 
        )-> Book: 

इंडेंट एक नीचे

def get_library_book(
    self, 
    book_id: str, 
    library_id: str 
) -> Book: 

PEP8 स्तर इंडेंट एक स्तर नीचे मामले का समर्थन करता है, लेकिन निर्दिष्ट नहीं करता है पहले के तहत संरेखित पैरामीटर की अनुमति है। यह कहता है:

एक लटकते इंडेंट का उपयोग करते समय निम्नलिखित पर विचार किया जाना चाहिए; वहां पहली पंक्ति पर कोई तर्क नहीं होना चाहिए और आगे इंडेंटेशन को स्वयं को निरंतरता रेखा के रूप में अलग करने के लिए उपयोग किया जाना चाहिए।

उत्तर

2

पीईपी 8 में इसमें कई अच्छे विचार हैं, लेकिन मैं व्हाइटस्पेस के बारे में इस तरह के सवाल का फैसला करने के लिए इस पर भरोसा नहीं करता। जब मैंने व्हाइटस्पेस पर पीईपी 8 की सिफारिशों का अध्ययन किया, तो मैंने उन्हें असंगत और यहां तक ​​कि विरोधाभासी पाया।

इसके बजाय, मैं सामान्य सिद्धांतों को देखता हूं जो लगभग सभी प्रोग्रामिंग भाषाओं पर लागू होते हैं, न केवल पायथन।

पहले उदाहरण में दिखाए गए कॉलम संरेखण में कई नुकसान हैं, और मैं इसे किसी भी परियोजना में उपयोग या अनुमति नहीं देता हूं।

नुकसान में से कुछ:

  • आप समारोह नाम बदलते हैं तो इसकी लंबाई अलग है, आप मापदंडों के सभी फिर से संगठित करना चाहिए।
  • जब आप यह रियलिगमेंट करते हैं, तो आपके स्रोत नियंत्रण भिन्नता अनावश्यक सफेद जगहों के परिवर्तनों से अव्यवस्थित होते हैं।
  • जैसे ही कोड अपडेट और रखरखाव किया जाता है, यह संभावना है कि जब आप वैरिएबल का नाम बदलते हैं तो आपको कुछ संरेखण याद आएगा, जिससे गलत तरीके से कोड किया जा सकता है।
  • आपको लंबी लाइन लंबाई मिलती है।
  • संरेखण एक आनुपातिक फ़ॉन्ट में काम नहीं करता है। (हाँ, कुछ डेवलपर्स आनुपातिक फोंट पसंद करते हैं, और यदि आप स्तंभ संरेखण से बचने के लिए अपने कोड प्रयुक्त होते या आनुपातिक फोंट में समान रूप से पढ़ा जा सके।)

यह भी बदतर यदि आप अधिक जटिल मामलों में स्तंभ संरेखण का उपयोग हो जाता है। इस उदाहरण पर विचार:

let mut rewrites = try_opt!(subexpr_list.iter() 
             .rev() 
             .map(|e| { 
              rewrite_chain_expr(e, 
                   total_span, 
                   context, 
                   max_width, 
                   indent) 
             }) 
             .collect::<Option<Vec<_>>>()); 

इस सर्वो ब्राउज़र, जिसकी शैली जनादेश स्तंभ संरेखण इस तरह की कोडिंग से जंग कोड है। हालांकि यह पायथन कोड नहीं है, वही सिद्धांत पाइथन या लगभग किसी भी भाषा में लागू होते हैं।

यह कोड कोड संरेखण का उपयोग कैसे खराब स्थिति की ओर जाता है इस कोड नमूना में स्पष्ट होना चाहिए। क्या होगा यदि आपको किसी अन्य फ़ंक्शन को कॉल करने की आवश्यकता है, या उस घोंसला वाले rewrite_chain_expr कॉल के अंदर एक लंबा चर नाम था? आप केवल कमरे से बाहर हैं जब तक कि आप बहुत लंबी लाइनें चाहते हैं।

इन संस्करणों जो अपने दूसरे अजगर उदाहरण की तरह एक विशुद्ध रूप से खरोज आधारित शैली का उपयोग से किसी के साथ ऊपर की तुलना करें:

let mut rewrites = try_opt!(
    subexpr_list 
     .iter() 
     .rev() 
     .map(|e| { 
      rewrite_chain_expr(e, total_span, context, max_width, indent) 
     }) 
     .collect::<Option<Vec<_>>>() 
); 

या, यदि rewrite_chain_expr के मानकों लंबे समय तक थे या तुम सिर्फ छोटी लाइनों चाहते थे:

let mut rewrites = try_opt!(
    subexpr_list 
     .iter() 
     .rev() 
     .map(|e| { 
      rewrite_chain_expr(
       e, 
       total_span, 
       context, 
       max_width, 
       indent 
      ) 
     }) 
     .collect::<Option<Vec<_>>>() 
); 

स्तंभ गठबंधन शैली के विपरीत, इस शुद्ध खरोज शैली के कई फायदे हैं और सभी में कोई नुकसान है।

2

PEP 8 के पिछले लाइन अधिक ध्यान से पहले "या एक फांसी मांगपत्र का उपयोग कर" भाग पढ़ें।

निरंतरता लाइनों खड़ी कोष्ठक, कोष्ठक और ब्रेसिज़ के अंदर में शामिल होने के अजगर का अंतर्निहित लाइन का उपयोग, या एक फांसी मांगपत्र का उपयोग कर लिपटे तत्वों या तो संरेखित चाहिए।

यह पहली "हां 'उदाहरण के लिए, और ऊपर अपना पहला उदाहरण को कवर करने का इरादा है।

# Aligned with opening delimiter. 
foo = long_function_name(var_one, var_two, 
         var_three, var_four) 
2

Appart Terrys जवाब से, typeshed से एक उदाहरण लेते हैं जो व्याख्या के लिए पायथन के GitHub पर परियोजना है ।

: स्टब्स साथ stdlib

उदाहरण के लिए, importlib.machinery में (और अन्य मामलों में अगर आप देखो) एनोटेशन अपना पहला रूप है, for example का उपयोग किया जाता है

def find_module(cls, fullname: str, 
       path: Optional[Sequence[importlib.abc._Path]] 
       ) -> Optional[importlib.abc.Loader]: 
संबंधित मुद्दे