मैं पायथन में इस लंबी लाइन को कैसे तोड़ सकता हूं?


176

आप इस तरह एक लंबी लाइन को कैसे स्वरूपित करेंगे? मैं इसे 80 से अधिक वर्णों तक विस्तृत नहीं करना चाहता:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

क्या यह मेरा सबसे अच्छा विकल्प है?

url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))

1
एक अच्छे विकल्प की तरह लगता है। आपको इसके बारे में क्या पसंद नहीं है?
हामिश ग्रुबीजन

2
थोड़ा व्यक्तिपरक, है ना? :)
एडम वो

1
संबं
धत लं क

14
आप "यह" में गलत को हटाकर एक चरित्र को बचा सकते हैं।
जाब

2
indexes: का सही बहुवचन indexहै indices
स्क्रूफी

जवाबों:


336

यह एक शुरुआत है। कोड के बाहर अपने लंबे स्ट्रिंग्स को परिभाषित करने के लिए उनका उपयोग करना एक बुरा अभ्यास नहीं है। यह डेटा और व्यवहार को अलग करने का एक तरीका है। आपका पहला विकल्प एक दूसरे से सटे बनाकर स्ट्रिंग शाब्दिकों को एक साथ जोड़ना है:

("This is the first line of my text, "
"which will be joined to a second.")

या लाइन एंडिंग जारी रखने के साथ, जो थोड़ा और नाजुक है, जैसा कि यह काम करता है:

"This is the first line of my text, " \
"which will be joined to a second."

लेकिन यह नहीं है:

"This is the first line of my text, " \ 
"which will be joined to a second."

फर्क देखें? नहीं? जब आप अपने कोड या तो यह नहीं होगा।

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

वैकल्पिक रूप से, आप कॉन्टैक्शन ऑपरेटर ( +) का उपयोग करके स्पष्ट रूप से जुड़ सकते हैं :

("This is the first line of my text, " + 
"which will be joined to a second.")

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

अंत में, आप ट्रिपल-उद्धृत स्ट्रिंग्स का उपयोग कर सकते हैं:

"""This is the first line of my text
which will be joined to a second."""

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

"""This is the first line of my text \
which will be joined to a second."""

यह ऊपर की समान तकनीक के समान समस्या है, उस सही कोड में केवल अदृश्य व्हाट्सएप द्वारा गलत कोड से अलग है।

कौन सा "सबसे अच्छा" आपकी विशेष स्थिति पर निर्भर करता है, लेकिन इसका उत्तर केवल सौंदर्यवादी नहीं है, बल्कि सूक्ष्म रूप से भिन्न व्यवहारों में से एक है।


26
CPython संकलक शाब्दिक संचालन को यथासंभव अनुकूलित करता है, जिसका अर्थ है कि दो स्ट्रिंग शाब्दिक को जोड़ने से बाइटकोड में केवल एक ही स्ट्रिंग शाब्दिक होता है।
इग्नासियो वाज़क्वेज़-अब्राम्स

2
हालांकि मुझे मिले सभी उत्तर मददगार हैं, लेकिन आप निश्चित रूप से तार को तोड़ने के सभी तरीकों को समझने में मेरी मदद करते हैं। क्या "\" लाइन समाप्त होने के साथ समस्या थी कि इसके बाद एक जगह थी?
गैटस्टर

1
मैं यहाँ अंतर नहीं देख सकता, लेकिन फिर, यह एसओ के बजाय आदिम वाक्यविन्यास रंग के कारण ज्यादातर है। (कुछ पूरी तरह से अच्छा कोड एसओ पर लगभग अपठनीय है, लेकिन केवल इसलिए कि यह ऐसी भाषा में नहीं है जिसका वाक्यविन्यास सी के बहुत करीब है।) यह आपके संपादक को अप्रिय स्थानों को उजागर करने के लिए असामान्य नहीं है, क्योंकि वे शायद ही कभी उपयोगी (या जानबूझकर) हैं । :-)
केन

1
@KhurshidAlam आप 'उस स्ट्रिंग को शामिल करने के लिए सिंगल कोट्स का उपयोग कर सकते हैं , या अपने स्ट्रिंग के अंदर डबल कोट्स से बच सकते हैं, या ट्रिपल डबल कोट्स का उपयोग कर सकते हैं """। उद्धरण वाले उद्धरणों के साथ समस्या एक ही है कि क्या आप शाब्दिक स्ट्रिंग को परिभाषित करने के लिए एक पंक्ति या कई लाइनों का उपयोग करते हैं।
ह्यूगोबर्ग

1
मेरा संपादक हमेशा की तरह पीछे हटने वाला व्हाट्सएप निकालता है। मैं आपको उसी सेटिंग को सक्षम करने की सलाह देता हूं। बेशक, नई लाइन पर व्हॉट्सएप अभी भी स्ट्रिंग का हिस्सा है, इसलिए मैंने उपयोग करना समाप्त कर दिया +
थेजय

46

संकलक द्वारा लगातार स्ट्रिंग शाब्दिक जुड़ जाते हैं, और कोष्ठक अभिव्यक्तियों को कोड की एक पंक्ति माना जाता है:

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))

11

व्यक्तिगत रूप से मैं खुले ब्लॉकों को लटकाना पसंद करता हूं, इसलिए मैं इसे प्रारूपित करूंगा

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

सामान्य तौर पर मैं 80-कॉलम की रेखा के भीतर कोड फिट बनाने के लिए संघर्ष को बहुत परेशान नहीं करता। यह उचित स्तर तक लाइन की लंबाई रखने लायक है, लेकिन कठिन 80 सीमा अतीत की बात है।


8
यह वास्तव में अतीत की बात नहीं है। पायथन मानक पुस्तकालय अभी भी PEP8 को अपने स्टाइल गाइड के रूप में उपयोग करता है, इसलिए नियम अभी भी मौजूद है, और बहुत सारे लोग (खुद शामिल) इसका पालन करते हैं। यह रेखा खींचने के लिए एक सुविधाजनक जगह है।
डेविन जीनपिएरे

3
मुझे आश्चर्य है कि कितने प्रोजेक्ट अभी भी 80 char नियम का पालन करते हैं। मेरे द्वारा उपयोग की जाने वाली औसत खिड़की के आकार के लिए, मुझे लगता है कि मेरे लिए 80 से अधिक वर्णों के लिए 100-120 अधिक उत्पादक है।
गैटस्टर

1
हां, यह उस लाइन की लंबाई के बारे में है जिसका मैं भी उपयोग करता हूं, हालांकि [हॉरर! sacrilege!] मैं एक आनुपातिक फ़ॉन्ट का उपयोग करता हूं, इसलिए सटीक लाइन की लंबाई इतनी महत्वपूर्ण नहीं है। यह एक बात है कि किसी एक पंक्ति पर कितने तर्क पठनीय हैं, कितने वर्णों से पठनीय है, जैसे कि ... यदि मुझे डेटा का एक लंबा तार मिला है, जिसे पढ़ने के लिए किसी को भी पढ़ने की आवश्यकता नहीं है, तो मुझे खुशी होगी 120.
बोबिन्स

कोड के लिए आनुपातिक फोंट - मैं आपके साथ हूं, भाई। मैंने कभी भी उनके साथ काम करने वाले सभी लोगों को परेशान करके देखते हुए, हालांकि उनके लिए दुनिया तैयार नहीं है।
१०:०२ पर jlarcombe

4
~ 80 अक्षर समान स्क्रीन पर अगल-बगल 2 फाइलों को अलग करना आसान बनाते हैं। इसके अलावा, यदि आपका सर्वर सर्वर के कंसोल पर गंभीर आपातकाल के दौरान कुछ डिबगिंग करता है, तो आप वास्तव में 80 वर्ण सीमा की सराहना करेंगे! :)
मिक टी

4

आप इसे कई लाइनों में तोड़ने के लिए टेक्स्टव्रेप मॉड्यूल का उपयोग कर सकते हैं

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

से प्रलेखन :

शब्दों को अलग करना। रैप (पाठ [, चौड़ाई [, ...]])
पाठ में एक ही पैराग्राफ लपेटता है (एक स्ट्रिंग) तो हर पंक्ति सबसे अधिक चौड़ाई लंबी है। अंतिम न्यूलाइन्स के बिना, आउटपुट लाइनों की सूची लौटाता है।

वैकल्पिक खोजशब्द तर्क TextWrapperनीचे प्रलेखित की उदाहरण विशेषताओं के अनुरूप हैं। चौड़ाई के लिए चूक70

TextWrapper.wrap()कैसे लपेटें () व्यवहार करता है पर अतिरिक्त विवरण के लिए विधि देखें ।


2

जो भी .format()एक लंबी स्ट्रिंग पर कॉल करने की कोशिश कर रहा है , और बाद के .format(कॉल को तोड़ने के बिना सबसे लोकप्रिय स्ट्रिंग रैपिंग तकनीकों में से कुछ का उपयोग करने में असमर्थ है , आप str.format("", 1, 2)इसके बजाय कर सकते हैं "".format(1, 2)। यह आपको जो भी तकनीक पसंद है उसके साथ स्ट्रिंग को तोड़ने देता है। उदाहरण के लिए:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

हो सकता है

logger.info(str.format(("Skipping {0} because its thumbnail was already"
+ "in our system as {1}"), line[indexes['url']], video.title))

अन्यथा, एकमात्र संभावना लाइन एंडिंग निरंतरता का उपयोग कर रही है, जिसे मैं व्यक्तिगत रूप से प्रशंसक नहीं हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.