PEP8 के अनुरूप और E501 को रोकने के लिए बहुत लंबी स्ट्रिंग कैसे लिखें


203

जैसा कि PEP8 आपके अजगर कार्यक्रम के लिए 80 कॉलम नियम से नीचे रखने का सुझाव देता है, मैं कैसे लंबे स्ट्रिंग्स के साथ इसका पालन कर सकता हूं, अर्थात

s = "this is my really, really, really, really, really, really, really long string that I'd like to shorten."

मैं इसे निम्नलिखित पंक्ति में विस्तारित करने के बारे में कैसे कहूँगा, अर्थात

s = "this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten."

जवाबों:


116

सबसे सुरक्षित समाधान हो सकता है:

s = "this is my really, really, really, really, really, really," \
    " really long string that I'd like to shorten."

प्रतिबिंब पर संपादित करें मैं मानता हूं कि रेखा निरंतरता के बजाय ब्रैकेट का उपयोग करने के टोड के सुझाव उन सभी कारणों के लिए बेहतर है जो वह देता है। मुझे केवल इतना ही झिझक है कि टुपल्स के साथ ब्रैकेटेड स्ट्रिंग्स को भ्रमित करना अपेक्षाकृत आसान है।


4
यही कारण है कि मुझे एक बेवकूफ लगा जैसे सवाल पोस्ट करना। चीयर्स।
फेडरर

8
एंडलाइन से बचकर यह लाइन निरंतरता है, न केवल निहित निष्कर्ष, और जब तक कि पीईपी 8 में हाल ही में स्पष्ट रूप से मना नहीं किया गया है, हालांकि अब एक भत्ता है, लेकिन लंबे समय तक तार के लिए नहीं। नीचे टोड का उत्तर सही है।
हारून हॉल

4
मुझे PEP8 पसंद है, लेकिन यह PEP8 का एक हिस्सा है जो मुझे पसंद नहीं है। मुझे लगता है कि टपल के साथ भ्रम की संभावना के कारण निहित निरंतरता स्पष्ट है,
monknomo

1
के बाद \ किसी भी खाली रिक्त स्थान को जोड़ने के लिए नहीं याद रखें
मृणाल सौरभ

क्या होगा यदि लंबी लाइन एक लंबी मल्टी-लाइन स्ट्रिंग के बीच में है?
थायने

298

इसके अलावा, क्योंकि पड़ोसी स्ट्रिंग स्थिरांक स्वचालित रूप से संक्षिप्त हो जाते हैं, आप इसे इस तरह भी कोड कर सकते हैं:

s = ("this is my really, really, really, really, really, really, "  
     "really long string that I'd like to shorten.")

नोट नो प्लस साइन, और मैंने अतिरिक्त कॉमा और स्थान जोड़ा जो आपके उदाहरण के प्रारूपण का अनुसरण करता है।

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

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

s = ("this is my really, really, really, really, really, really, " # comments ok
     "really long string that I'd like to shorten.")

मैंने "अजगर लाइन की लंबाई" की एक Google खोज का उपयोग किया था जो पहले परिणाम के रूप में PEP8 लिंक को लौटाता है, लेकिन इस विषय पर एक और अच्छे StackOverflow पोस्ट से भी लिंक करता है: " पायथन PEP-8 को अधिकतम 79 वर्णों की अधिकतम लंबाई क्यों निर्दिष्ट करनी चाहिए? "

एक और अच्छा खोज वाक्यांश "अजगर लाइन निरंतरता" होगा।


8
+1: "व्यक्तिगत रूप से मुझे बैकस्लैश पसंद नहीं है, और मुझे कहीं पढ़ने में याद आता है कि इसका उपयोग वास्तव में इस रूप के पक्ष में किया गया है जो अधिक स्पष्ट है। याद रखें" स्पष्ट रूप से निहितार्थ से बेहतर है। ""
अल्बर्टो मेगिया

13
हर किसी के लिए जो एक टप्पल हो जाता है और आश्चर्य होता है कि यहां लाइनों के अंत में कॉमा को न जोड़ें, जिसके परिणामस्वरूप एक ट्यूल होगा, न कि एक स्ट्रिंग। ;)
Bugmenot123

7
दिए गए उदाहरण की तुलना में + वर्ण को अधिक स्पष्ट नहीं जोड़ रहा है? मैं अभी भी इस निहित पर विचार करेंगे। यानी "str1" + "str2"बजाय"str1" "str2"
user1318135

4
मैं वास्तव में सहमत हूं कि प्लस चिन्ह अधिक स्पष्ट है, लेकिन यह एक अलग बात करता है। यह स्ट्रिंग को कई टुकड़ों में एक एकल स्ट्रिंग स्थिर निर्दिष्ट करने के बजाय, एक अभिव्यक्ति में बदल देता है। मुझे यकीन नहीं है लेकिन मुझे लगता है कि यह पार्सिंग के दौरान किया जाता है जबकि अभिव्यक्ति को बाद में निष्पादित करने की आवश्यकता होती है। गति अंतर शायद नगण्य है जब तक कि उनमें से एक बड़ी संख्या नहीं है। लेकिन यह भी सौंदर्यशास्त्रीय रूप से मैं स्वत: संघनन पसंद करता हूं क्योंकि यह प्रति पंक्ति एक कम अव्यवस्थित चरित्र है।
टॉड

4
यह वाक्यविन्यास भी स्ट्रिंग स्वरूपण को लागू करने की संभावना रखता है जैसे:('this is my really, really, really, really, really long {} ' 'that I'd really, really, really, like to {}').format(var1, var2))
टिम

16

मुझे लगता है कि आपके प्रश्न में सबसे महत्वपूर्ण शब्द "सुझाव" था।

कोडिंग मानक मजेदार चीजें हैं। अक्सर वे जो मार्गदर्शन प्रदान करते हैं उसका एक बहुत अच्छा आधार होता है जब यह लिखा गया था (उदाहरण के लिए अधिकांश टर्मिनल एक पंक्ति में 80 वर्णों को दिखाने में असमर्थ हैं), लेकिन समय के साथ वे कार्यात्मक रूप से अप्रचलित हो जाते हैं, लेकिन फिर भी कठोरता से पालन किया जाता है। मुझे लगता है कि आपको यहां क्या करने की आवश्यकता है, "ब्रेकिंग" के सापेक्ष गुणों को तौलना है जो आपके कोड की पठनीयता और मुख्यता के खिलाफ विशेष सुझाव है।

क्षमा करें यह सीधे आपके प्रश्न का उत्तर नहीं देता है।


मैं पूरी तरह सहमत हूँ। एक समान जावा शैली नियम है जो अप्रचलित भी हो गया है (IMHO)।
इकेर जिमेनेज़

हां मैं सहमत हूं, हालांकि यह मेरे सिर को लताड़ रहा है कि मैं इस विशेष उदाहरण में इसका पालन कैसे करूंगा। मैं हमेशा कक्षाओं, विधियों को <80 वर्णों पर रखने की कोशिश करता हूं, हालांकि मैं कहूंगा कि यह एक स्ट्रिंग है जैसे कि एक नकारात्मक एक के अलावा कोई प्रभाव नहीं है।
फेडरर 15

1
आपको समुदाय-व्यापी कोडिंग मानक के विरुद्ध अपनी व्यक्तिगत पसंद को भी तौलना होगा। आप चाहते हैं कि नए लोग पहले दिन से कोड स्वरूपण में आने में सक्षम हों।
रेट्रासील

1
मैं अपने स्वयं के लिए जानता हूं, मैं सिर्फ 80 कैरेक्टर की सीमा पर टिकता हूं क्योंकि मैं अभी भी अपनी ज्यादातर कोडिंग आईडीएलई में करता हूं और मुझे यह पसंद नहीं है कि यह क्षैतिज स्क्रॉलिंग को हैंडल करता है। (नो स्क्रोल बार)
टॉफिस्टेड डेथ

@retracile - हाँ, आप करते हैं। मैं यह नहीं कह रहा हूं कि "आपको मार्गदर्शन को अनदेखा करना चाहिए", बल्कि यह सुझाव देते हुए कि कुछ मामलों में समुदाय के अच्छे के लिए मार्गदर्शन आवश्यक नहीं है। मुझे आईडीएलई के प्रतिबंधों के बारे में पता नहीं था (जैसा कि टोफिस्टेथ द्वारा पोस्ट किया गया था) लेकिन उस उदाहरण में सम्मेलन का पालन करने के लिए एक तर्क है।
ज़ोंबीशेप

13

आप एक स्थान खो दिया है, और आप शायद एक लाइन निरंतरता चरित्र, यानी की जरूरत है। a \

s = "this is my really, really, really, really, really, really" +  \
    " really long string that I'd like to shorten."

या और भी:

s = "this is my really, really, really, really, really, really"  \
    " really long string that I'd like to shorten."

Parens लाइन की निरंतरता के बजाय भी काम करेंगे, लेकिन आप किसी को यह सोच कर जोखिम में डाल देते हैं कि आप एक टुपल का इरादा रखते हैं और सिर्फ एक अल्पविराम को भूल गए हैं। उदाहरण के लिए लें:

s = ("this is my really, really, really, really, really, really"
    " really long string that I'd like to shorten.")

बनाम:

s = ("this is my really, really, really, really, really, really",
    " really long string that I'd like to shorten.")

पायथन के डायनेमिक टाइपिंग के साथ, कोड किसी भी तरह से चल सकता है, लेकिन आपके द्वारा इरादा नहीं किए जाने पर गलत परिणाम उत्पन्न करता है।


2

बैकस्लैश:

s = "this is my really, really, really, really, really, really" +  \
    "really long string that I'd like to shorten."

या पैरेंस में लपेटें:

s = ("this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten.")

2
ध्यान दें कि प्लस आवश्यक है। पायथन स्ट्रिंग शाब्दिकों को एक दूसरे का अनुसरण करता है।
bukzor

2

ये सभी महान उत्तर हैं, लेकिन मुझे एक संपादक प्लगइन नहीं मिला जो मुझे "स्पष्ट रूप से संक्षिप्त" तार को संपादित करने में मदद करेगा, इसलिए मैंने इसे आसान बनाने के लिए एक पैकेज लिखा।

पाइप पर (पैराग्राफ स्थापित करें) यदि कोई भी इस पुराने धागे को भटक ​​रहा है, तो इसे जांचना चाहेंगे। जिस तरह से html करता है, मल्टी-लाइन तार को स्वरूपित करता है (व्हाट्सएप को संपीड़ित करता है, एक नए पैराग्राफ के लिए दो न्यूलाइन्स, लाइनों के बीच रिक्त स्थान के बारे में कोई चिंता नहीं)।

from paragraphs import par


class SuddenDeathError(Exception):
    def __init__(self, cause: str) -> None:
        self.cause = cause

    def __str__(self):
        return par(
            f""" Y - e - e - e - es, Lord love you! Why should she die of
            {self.cause}? She come through diphtheria right enough the year
            before. I saw her with my own eyes. Fairly blue with it, she
            was. They all thought she was dead; but my father he kept ladling
            gin down her throat till she came to so sudden that she bit the bowl
            off the spoon. 

            What call would a woman with that strength in her have to die of
            {self.cause}? What become of her new straw hat that should have
            come to me? Somebody pinched it; and what I say is, them as pinched
            it done her in."""
        )


raise SuddenDeathError("influenza")

बन जाता है ...

__main__.SuddenDeathError: Y - e - e - e - es, Lord love you! Why should she die of influenza? She come through diphtheria right enough the year before. I saw her with my own eyes. Fairly blue with it, she was. They all thought she was dead; but my father he kept ladling gin down her throat till she came to so sudden that she bit the bowl off the spoon.

What call would a woman with that strength in her have to die of influenza? What become of her new straw hat that should have come to me? Somebody pinched it; and what I say is, them as pinched it done her in.

सब कुछ आसानी से (विम) 'gq'


0

एक साथ \आप एक से अधिक लाइनों के लिए बयान का विस्तार कर सकते हैं:

s = "this is my really, really, really, really, really, really" + \
"really long string that I'd like to shorten."

कार्य करना चाहिए।


0

मैं कुछ तरीकों का उपयोग करने के लिए बड़े तार निर्दिष्ट करने के लिए यहां उल्लेख नहीं करता हूं, लेकिन ये बहुत विशिष्ट परिदृश्यों के लिए हैं। YMMV ...

  • बहु-पंक्ति पाठ की बूँदें, अक्सर स्वरूपित टोकन (जो आप पूछ रहे थे, लेकिन अभी भी उपयोगी नहीं है) के साथ:

    error_message = '''
    I generally like to see how my helpful, sometimes multi-line error
    messages will look against the left border.
    '''.strip()
  • जो भी स्ट्रिंग प्रक्षेप विधि आप पसंद करते हैं उसके माध्यम से चर टुकड़ा-दर-टुकड़ा बढ़ाएं:

    var = 'This is the start of a very,'
    var = f'{var} very long string which could'
    var = f'{var} contain a ridiculous number'
    var = f'{var} of words.'
  • इसे एक फ़ाइल से पढ़ें। PEP-8 एक फ़ाइल में तार की लंबाई को सीमित नहीं करता है; बस आपके कोड की लाइनें। :)

  • न्यूटैनों का उपयोग करते हुए स्ट्रिंग को मैनगाएबल लाइनों में विभाजित करने के लिए ब्रूट-बल या अपने संपादक का उपयोग करें, और फिर सभी न्यूलाइन्स को हटा दें। (मैं सूचीबद्ध पहली तकनीक के समान):

    foo = '''
    agreatbigstringthatyoudonotwanttohaveanyne
    wlinesinbutforsomereasonyouneedtospecifyit
    verbatimintheactualcodejustlikethis
    '''.replace('\n', '')

0

उपलब्ध विकल्प:

  • बैकलैश :"foo" \ "bar"
  • प्लस चिन्ह बैकस्लैश के बाद :"foo" + \ "bar"
  • कोष्ठक :
    • ("foo" "bar")
    • प्लस साइन के साथ कोष्ठक :("foo" + "bar")
    • PEP8, E502: बैकस्लैश कोष्ठक के बीच निरर्थक है

बचें

कॉमा के साथ कोष्ठक से बचें: ("foo", "bar")जो एक टपल को परिभाषित करता है।


>>> s = "a" \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = "a" + \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = ("a"
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> s = ("a",
... "b")
>>> type(s)
<class 'tuple'>
>>> s = ("a" + 
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> 

0

यदि आप एक लंबी स्ट्रिंग शाब्दिक सम्मिलित करना चाहते हैं और flake8 को बंद करना चाहते हैं, तो आप इसका उपयोग निर्देशों को बंद करने के लिए कर सकते हैं । उदाहरण के लिए, एक परीक्षण दिनचर्या में मैंने कुछ नकली सीएसवी इनपुट को परिभाषित किया। मैंने पाया कि इसे और अधिक लाइनों में विभाजित करना, जिसमें यह पंक्तियाँ शक्तिशाली रूप से भ्रामक होंगी, इसलिए मैंने # noqa: E501इस प्रकार जोड़ने का फैसला किया :

csv_test_content = """"STATION","DATE","SOURCE","LATITUDE","LONGITUDE","ELEVATION","NAME","REPORT_TYPE","CALL_SIGN","QUALITY_CONTROL","WND","CIG","VIS","TMP","DEW","SLP","AA1","AA2","AY1","AY2","GF1","MW1","REM"
"94733099999","2019-01-03T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","050,1,N,0010,1","22000,1,9,N","025000,1,9,9","+0260,1","+0210,1","99999,9","24,0000,9,1",,"0,1,02,1","0,1,02,1","01,99,1,99,9,99,9,99999,9,99,9,99,9","01,1","SYN05294733 11/75 10502 10260 20210 60004 70100 333 70000="
"94733099999","2019-01-04T04:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","090,1,N,0021,1","22000,1,9,N","025000,1,9,9","+0378,1","+0172,1","99999,9","06,0000,9,1",,"0,1,02,1","0,1,02,1","03,99,1,99,9,99,9,99999,9,99,9,99,9","03,1","SYN04294733 11/75 30904 10378 20172 60001 70300="
"94733099999","2019-01-04T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","290,1,N,0057,1","99999,9,9,N","020000,1,9,9","+0339,1","+0201,1","99999,9","24,0000,9,1",,"0,1,02,1","0,1,02,1",,"02,1","SYN05294733 11970 02911 10339 20201 60004 70200 333 70000="
"94733099999","2019-01-05T22:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","200,1,N,0026,1","99999,9,9,N","000100,1,9,9","+0209,1","+0193,1","99999,9","24,0004,3,1",,"1,1,02,1","1,1,02,1","08,99,1,99,9,99,9,99999,9,99,9,99,9","51,1","SYN05294733 11/01 82005 10209 20193 69944 75111 333 70004="
"94733099999","2019-01-08T04:00:00","4","-32.5833333","151.1666666","45.0","SINGLETON STP, AS","FM-12","99999","V020","070,1,N,0026,1","22000,1,9,N","025000,1,9,9","+0344,1","+0213,1","99999,9","06,0000,9,1",,"2,1,02,1","2,1,02,1","04,99,1,99,9,99,9,99999,9,99,9,99,9","02,1","SYN04294733 11/75 40705 10344 20213 60001 70222="
"""  # noqa: E501

-1

मैंने अतीत में textwrap.dedent का उपयोग किया है। यह थोड़ा बोझिल है इसलिए मैं अब लाइन निरंतरता को पसंद करता हूं लेकिन अगर आप वास्तव में ब्लॉक इंडेंट चाहते हैं, तो मुझे लगता है कि यह बहुत अच्छा है।

उदाहरण कोड (जहां ट्रिम एक स्लाइस के साथ पहले '\ n' से छुटकारा पाने के लिए है):

import textwrap as tw
x = """\
       This is a yet another test.
       This is only a test"""
print(tw.dedent(x))

स्पष्टीकरण:

समर्पण पाठ की पहली पंक्ति में एक नई पंक्ति से पहले सफेद स्थान पर आधारित इंडेंटेशन की गणना करता है। यदि आप इसे ट्वीक करना चाहते हैं, तो आप reमॉड्यूल का उपयोग करके इसे आसानी से लागू कर सकते हैं ।

इस पद्धति की सीमाएँ बहुत लंबी लाइनों में अभी भी हो सकती हैं जो आप चाहते हैं कि किस मामले में अन्य तरीके जो कंकरीट के तार अधिक उपयुक्त हैं।


1
x[1:]आपके साथ ट्रिमिंग करने के बजाय x = """पहले न्यूलाइन से बचने के लिए बैकस्लैश लगा सकते हैं ।
माइकल डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.