2013-04-18 6 views
13

में बयान के साथ एक लंबी तोड़ने के लिए मैं इस तरह अजगर में कोड की एक पंक्ति है लेकिन उन्हें एक बुरा अभ्यास माना जाता है। मैं contextlib.nested का भी उपयोग कर सकता हूं, लेकिन बहिष्कृत है, क्या कोई अन्य विकल्प है?कैसे अजगर

+4

बैकस्लैश बुरा व्यवहार नहीं माना जाता है, यह सिर्फ जब संभव अलग लाइनों में कोड को तोड़ने के लिए कोष्ठक या अल्पविराम का उपयोग करने के लिए पसंद है। – jamylak

उत्तर

17

इस सवाल के आधार की उपेक्षा करता है, लेकिन मैं वास्तव में इस मामले के बैकस्लैश का उपयोग कर की सिफारिश करेंगे:

with really_really_long_name_function(p) as f1, \ 
     other_really_really_long_name_function() as f2: 
    pass 

रूप @JonClements कहा, तुम इस मामले में कोष्ठक या अल्पविराम का उपयोग नहीं कर सकते हैं, वहाँ तो कोई विकल्प नहीं है बैकस्लाश जाने का तरीका है और कोड बहुत साफ आईएमओ दिखता है।

+0

ऐसा लगता है आपके कोष्ठकों 'other_really_really_long_name_function' के अंत भूल गया। –

+3

हाँ - के बाद से कोष्ठक नहीं किया जा सकता तो, हाँ, मैं यह आसानी से सबसे पठनीय और इस मामले में व्यावहारिक है backslashing मानना ​​.... –

+0

@segfolt निश्चित (एक ठीक से न्यायोचित कारण है कि हालांकि नहीं सोच सकते हैं)। 'E127 निरंतरता लाइन दृश्य indent' के लिए अति-इंडेंट: – jamylak

11

आप बैकस्लैश से बचना चाहते हैं, तो आप लंबे समय के नाम उर्फ ​​कर सकते हैं:

lnf = long_name_function 
olnf = other_long_name_function 
with lnf(p) as a, olnf(): 
    # ... 

या आप कर सकते थे घोंसला बयान:

with long_name_function(p) as a: 
    with other_long_name_function(): 
     pass 

आप करते नहीं contextlib.nested() उपयोग करना चाहते हैं; इसके साथ कई समस्याएं हैं जो सीधे इसके बहिष्कार का कारण बनती हैं। पहले संदर्भ प्रबंधकों को घोंसले में बाद के संदर्भ प्रबंधकों के साथ समस्याओं के लिए कवर नहीं किया गया है, उदाहरण के लिए।

+2

यह बहुत खराब ब्रांड्स यहां अच्छी तरह से काम नहीं करते हैं। –

+0

@JaredGoguen: आप अभिव्यक्ति है कि बनाता है या नाम कोष्ठक में संदर्भ प्रबंधक रख सकते हैं, लेकिन यह है कि सिर्फ वास्तव में बदसूरत हो जाता है। –