एक लंबी बहु-पंक्ति स्ट्रिंग बनाने का पायथोनिक तरीका


1303

मेरे पास बहुत लंबी क्वेरी है। मैं इसे पायथन में कई लाइनों में विभाजित करना चाहूंगा। जावास्क्रिप्ट में ऐसा करने का एक तरीका कई वाक्यों का उपयोग करना होगा और उन्हें एक +ऑपरेटर के साथ जोड़ना होगा (मुझे पता है, शायद यह करने का सबसे कुशल तरीका नहीं है, लेकिन मैं वास्तव में इस चरण में प्रदर्शन के बारे में चिंतित नहीं हूं, बस कोड पठनीयता है) । उदाहरण:

var long_string = 'some text not important. just garbage to' +
                  'illustrate my example';

मैंने पायथन में कुछ ऐसा ही करने की कोशिश की, लेकिन यह काम नहीं किया, इसलिए मैं \लंबे स्ट्रिंग को विभाजित करता था। हालांकि, मुझे यकीन नहीं है कि यह ऐसा करने का एकमात्र / सबसे अच्छा / pythonicest तरीका है। यह अटपटा लगता है। वास्तविक कोड:

query = 'SELECT action.descr as "action", '\
    'role.id as role_id,'\
    'role.descr as role'\
    'FROM '\
    'public.role_action_def,'\
    'public.role,'\
    'public.record_def, '\
    'public.action'\
    'WHERE role.id = role_action_def.role_id AND'\
    'record_def.id = role_action_def.def_id AND'\
    'action.id = role_action_def.action_id AND'\
    'role_action_def.account_id = ' + account_id + ' AND'\
    'record_def.account_id=' + account_id + ' AND'\
    'def_id=' + def_id

207
चूँकि आपका उदाहरण किसी इंजेक्शन के हमले के इंतज़ार में SQL ब्लॉक की तरह दिखता है, इसलिए एक अन्य सुझाव यह है कि SQLAlchemy जैसे उच्च स्तर के SQL लाइब्रेरी या इस तरह से कच्चे SQL को एक साथ हैक करने से साफ़ करने के लिए कुछ और देखें। (शायद ऑफ-टॉपिक, लेकिन आपने "किसी भी सुझाव" के लिए पूछा?)
जॉन गेन्स जूनियर

6
यह "pythonic तरीका बनाने के लिए है बहु लाइन कोड एक लंबी स्ट्रिंग के लिए" एक स्ट्रिंग बनाने के लिए युक्त नई-पंक्तियों को देखने textwrap.dedent
बॉब स्टीन

8
@ इस्सर मैंने पांच साल से अधिक समय पहले यह प्रश्न लिखा था, लेकिन मुझे याद है कि यह न जाने कैसे कई लाइनों में लंबे एसक्यूएल क्वेरी को ठीक से डालना है। मैं मानता हूं कि मैं उस लंबे स्ट्रिंग के साथ बेवकूफी भरी बातें कर रहा था, लेकिन यह मेरा सवाल नहीं था और मैं इसे बेहतर उदाहरण के लिए देखने के लिए पर्याप्त स्मार्ट नहीं था कि यह कुछ sql इंजेक्शन चिंताओं को शामिल न करे।
पाब्लो मेचर

@ इस्सर नहीं, यह एक्सवाई समस्या नहीं है, किसी भी मामले में क्वेरी को कई लाइनों में सबसे अच्छा स्वरूपित किया जाएगा। SQLi हाथ में सवाल से संबंधित नहीं है। हालांकि बड़े बोल्ड चेतावनियां पूरी तरह से उचित हैं :)
Bugmenot123

मैंने इसके लिए एक छोटा पैकेज लिखा। यहाँ उदाहरण: stackoverflow.com/a/56940938/1842491
Shay

जवाबों:


2224

क्या आप मल्टी-लाइन स्ट्रिंग्स के बारे में बात कर रहे हैं? आसान, उन्हें शुरू और समाप्त करने के लिए ट्रिपल उद्धरण का उपयोग करें।

s = """ this is a very
        long string if I had the
        energy to type more and more ..."""

आप एकल उद्धरणों का भी उपयोग कर सकते हैं (उनमें से 3 बिल्कुल शुरू और अंत में) और sकिसी भी अन्य स्ट्रिंग की तरह परिणामी स्ट्रिंग का इलाज करें ।

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

अर्थात,:

' this is a very\n        long string if I had the\n        energy to type more and more ...'

अंत में, कोई भी अजगर की तरह लंबी लाइनें बना सकता है:

 s = ("this is a very"
      "long string too"
      "for sure ..."
     )

जिसमें कोई अतिरिक्त ब्लैंक या न्यूक्लियर शामिल नहीं होंगे (यह एक जानबूझकर उदाहरण है जिसमें दिखाया गया है कि कंबल खाली करने का क्या प्रभाव होगा:

'this is a verylong string toofor sure ...'

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


8
मैं दूसरी विधि के लिए स्पष्ट रूप से "+" ऑपरेटर का उपयोग करना पसंद करता हूं। ज्यादा परेशानी नहीं है और पठनीयता में सुधार होता है।
मार्को सुल्ला

38
@LucasMalor आसन्न स्ट्रिंग्स एक संकलन-समय का संयोजन है। +ऑपरेटर का उपयोग नहीं करता है कि क्या रनटाइम के दौरान कॉन्सेप्टेशन होता है?
जोशुआ टेलर

13
संदर्भ के लिए, इस घटना की आधिकारिक डॉक्स हैं: docs.python.org/2/reference/... (अजगर 2) और docs.python.org/3/reference/... (अजगर 3)
neverendingqs

4
आपका उदाहरण अच्छा है, लेकिन मैं चाहता हूं कि इसमें यह प्रदर्शित किया जाए कि कैसे चर में सुरक्षित और सुरक्षित रूप से डेटा को एम्बेड किया जाए। दोनों ओपी और @ जेसीई उदाहरण कोड दिखाते हैं कि यह कैसे सही तरीके से नहीं किया जाता है (वे एसक्यूएल हमलों के लिए निमंत्रण हैं)। इसे भी देखें: dev.mysql.com/doc/connector-python/en/…
स्कॉट

2
आप textwrap.dedentअवांछित प्रमुख व्हाट्सएप को हटाने के लिए उपयोग कर सकते हैं । docs.python.org/3/library/textwrap.html#textwrap.dedent
कोरी गोल्डबर्ग

190

यदि आप एक बहुस्तरीय स्ट्रिंग नहीं चाहते हैं, लेकिन आपके पास एक लंबी एकल पंक्ति है, तो आप कोष्ठक का उपयोग कर सकते हैं, बस सुनिश्चित करें कि आप स्ट्रिंग खंडों के बीच अल्पविराम शामिल नहीं करते हैं, तो यह एक तुच्छ बात होगी।

query = ('SELECT   action.descr as "action", '
         'role.id as role_id,'
         'role.descr as role'
         ' FROM '
         'public.role_action_def,'
         'public.role,'
         'public.record_def, '
         'public.action'
         ' WHERE role.id = role_action_def.role_id AND'
         ' record_def.id = role_action_def.def_id AND'
         ' action.id = role_action_def.action_id AND'
         ' role_action_def.account_id = '+account_id+' AND'
         ' record_def.account_id='+account_id+' AND'
         ' def_id='+def_id)

SQL स्टेटमेंट में जैसे कि आप क्या निर्माण कर रहे हैं, मल्टीलाइन स्ट्रिंग्स भी ठीक होगी। लेकिन अगर अतिरिक्त व्हाट्सएप में एक मल्टीलाइन स्ट्रिंग में कोई समस्या होगी, तो यह एक अच्छा तरीका होगा जिसे आप प्राप्त करना चाहते हैं।


1
@ पाब्लो आप टिप्पणी के बाद भी जोड़ सकते हैं,
अश्विनी चौधरी

@ 200OK आप के बाद मतलब है '?
कोन मनोवैज्ञानिक

3
इस स्ट्रिंग को प्रारूपित करने का दूसरा तरीका .format(...)समापन कोष्ठक के बाद जोड़ना होगा । %संकेतन संकेतन भी काम करना चाहिए, लेकिन मैंने यह कोशिश नहीं की है
kon psych

3
ध्यान दें कि प्रत्येक पंक्ति को एक स्ट्रिंग स्थिरांक के साथ समाप्त होना चाहिए, इसलिए ' foo '+variableकाम नहीं करेगा, लेकिन ' foo '+variable+''होगा।
योयो

46
यह उदाहरण SQL इंजेक्शन हमलों के लिए एक खुला दरवाजा है। कृपया, कोई भी किसी भी सार्वजनिक-सामना करने वाले एप्लिकेशन पर इसका उपयोग नहीं करता है। 'प्लेसहोल्डर' का उपयोग करने के लिए MySQL डॉक्स देखें: dev.mysql.com/doc/connector-python/en/…
स्कॉट

138

\मेरे लिए काम करके लाइनों को तोड़ना । यहाँ एक उदाहरण है:

longStr = "This is a very long string " \
        "that I wrote to help somebody " \
        "who had a question about " \
        "writing long strings in Python"

9
मैं या तो ट्रिपल उद्धरण संकेतन या अंदर लपेटना पसंद करूँगा () to \ चरित्र
खान हुआ

14
मैं निम्नलिखित पंक्तियों के अंत में निम्नलिखित पंक्तियों की शुरुआत में रिक्त स्थान डालने की दृढ़ता से सलाह देता हूं। इस तरह एक गलती से गायब होने का तरीका अधिक स्पष्ट है (और इस तरह होने की संभावना कम है)।
अल्फ

लाइनों के अंत में चर के साथ भी काम करता हैlongStr = "account: " + account_id + \ ...
19 frmbelz

मैं निम्न त्रुटि हो रही है: the backslash is redundant between bracketsजब मैं अंदर में लिखा थाprint()
alper

50

मैंने खुद को इस से खुश पाया:

string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')

30
सहमत नहीं हैं। क्या होगा यदि पहली पंक्ति ("स्ट्रिंग = ...") भारी इंडेंट है? किसी को शून्य इंडेंटेशन के लिए निम्न पंक्तियों को डी-डेंट करना होगा, जो अन्यथा इंडेंटेड ब्लॉक के बीच में बदसूरत दिखता है।
xjcl

1
ठीक है, मेरी लंबी स्ट्रिंग्स का अधिकांश हिस्सा मॉड्यूल स्तर पर होता है, जहां यह अच्छी तरह से फिट बैठता है। आपके मामले में हालांकि यह स्पष्ट रूप से सबसे अच्छा समाधान नहीं होगा।
Eero Aaltonen

1
मुझे यह दृष्टिकोण पसंद है क्योंकि यह पढ़ने वाले विशेषाधिकार है। ऐसे मामलों में जहां हमारे पास लंबे समय से तार हैं, कोई रास्ता नहीं है ... आप जो इंडेंटेशन के स्तर पर निर्भर करते हैं और अभी भी प्रति पंक्ति 80 वर्णों तक सीमित हैं ... खैर ... कुछ और कहने की आवश्यकता नहीं है। मेरे विचार में अजगर शैली के मार्गदर्शक अभी भी बहुत अस्पष्ट हैं। धन्यवाद!
एडुआर्डो लुसियो

यह बहुत बदसूरत अगर यह एक मॉड्यूल के तहत किया जाता है हो सकता है, मैं भी रूप में करने के लिए है.replace('\t','')
alper

44

मुझे लगता है कि जब लंबे तार का निर्माण होता है, तो आप आमतौर पर SQL क्वेरी बनाने की तरह कुछ कर रहे हैं, इस मामले में यह सबसे अच्छा है:

query = ' '.join((  # note double parens, join() takes an iterable
    "SELECT foo",
    "FROM bar",
    "WHERE baz",
))

लेवोन ने जो सुझाव दिया वह अच्छा है, लेकिन गलतियों के प्रति संवेदनशील हो सकता है:

query = (
    "SELECT foo"
    "FROM bar"
    "WHERE baz"
)

query == "SELECT fooFROM barWHERE baz"  # probably not what you want

8
+1 कोड-समीक्षक को अपर्याप्त व्हाट्सएप के लिए हर पंक्ति के सही अंत की जांच करने से रोकता है । ओपी ने यह गलती कई बार की, जैसा कि @KarolyHorvath ने नोट किया था।
बॉब स्टेन

2
जब इसी तरह के फैशन में कोडित मल्टीलाइन स्ट्रिंग्स की समीक्षा करते हैं, तो मुझे आसानी से पुष्टि के लिए हर पंक्ति के बाएं छोर पर पर्याप्त व्हाट्सएप की आवश्यकता होती है ।
छाता

3
@ BobStein-VisiBone कोड समीक्षाएँ वाक्यविन्यास त्रुटियों या इस तरह के छोटे कीड़े के बारे में नहीं होनी चाहिए, वे पदार्थ के बारे में होनी चाहिए। यदि कोई व्यक्ति सिंटैक्स त्रुटियों की समीक्षा के लिए कोड डाल रहा है (और इस तरह या तो या कुछ स्थितियों में नहीं चलेगा) तो कुछ गंभीर रूप से गलत है। इससे पहले कि आप प्रतिबद्ध हों, लिंट को चलाना कठिन नहीं है। यदि व्यक्ति ने अपने कार्यक्रम पर ध्यान नहीं दिया है तो वह सही ढंग से नहीं चल रहा है क्योंकि उन्होंने ऐसी स्पष्ट गलती की है, उन्हें प्रतिबद्ध नहीं होना चाहिए।
चार्ल्स अदीस

1
सहमत @CharlesAddis, कोड समीक्षा स्वचालित तरीकों के बाद आना चाहिए, जैसे लिंट, सिंटैक्स हाइलाइटिंग, आदि। हालांकि कुछ सफेद-अंतरिक्ष-लापता कीड़े उस तरह से नहीं पकड़े जा सकते हैं। अपने आप को कीड़े के खिलाफ की रक्षा में सभी उचित लाभ प्राप्त करें, मेरा सुझाव है।
बॉब स्टीन

33

जब आप "" नोटेशन का उपयोग कर रहे हैं, तो आप चर को भी परिवर्तित कर सकते हैं:

foo = '1234'

long_string = """fosdl a sdlfklaskdf as
as df ajsdfj asdfa sld
a sdf alsdfl alsdfl """ +  foo + """ aks
asdkfkasdk fak"""

EDIT: एक बेहतर तरीका मिला, जिसका नाम params और .format () है:

body = """
<html>
<head>
</head>
<body>
    <p>Lorem ipsum.</p>
    <dl>
        <dt>Asdf:</dt>     <dd><a href="{link}">{name}</a></dd>
    </dl>
    </body>
</html>
""".format(
    link='http://www.asdf.com',
    name='Asdf',
)

print(body)

26

यह दृष्टिकोण उपयोग करता है:

  • शुरुआती लाइनफीड से बचने के लिए सिर्फ एक बैकस्लैश
  • ट्रिपल उद्धृत स्ट्रिंग का उपयोग करके लगभग कोई आंतरिक विराम चिह्न नहीं
  • टेक्स्टवैप inspect मॉड्यूल का उपयोग करके स्थानीय इंडेंटेशन को स्ट्रिप्स करता है
  • account_idऔर def_idवैरिएबल के लिए अजगर 3.6 स्वरूपित स्ट्रिंग प्रक्षेप ('एफ') का उपयोग करता है ।

यह रास्ता मुझे सबसे ज्यादा अजीब लगता है।

# import textwrap  # See update to answer below
import inspect

# query = textwrap.dedent(f'''\
query = inspect.cleandoc(f'''
    SELECT action.descr as "action", 
    role.id as role_id,
    role.descr as role
    FROM 
    public.role_action_def,
    public.role,
    public.record_def, 
    public.action
    WHERE role.id = role_action_def.role_id AND
    record_def.id = role_action_def.def_id AND
    action.id = role_action_def.action_id AND
    role_action_def.account_id = {account_id} AND
    record_def.account_id={account_id} AND
    def_id={def_id}'''
)

अपडेट : 1/29/2019 @ ShadowRanger के inspect.cleandocबजाय का उपयोग करने का सुझाव शामिल करेंtextwrap.dedent


5
नोट: inspect.cleandocकी तुलना textwrap.dedentमें यह थोड़ा अच्छा है , क्योंकि इसके लिए पहली पंक्ति के अंत में लाइन निरंतरता वर्ण के साथ खाली होने की आवश्यकता नहीं है।
शैडो रेंजर

2
@ शादो रेंजर वाह मैंने पहले कभी भी क्लींडोक का इस्तेमाल नहीं किया। मैंने इसके लिए अपने उत्तर और भविष्य के उपयोग को अद्यतन किया inspect.cleandoc
क्रिस्टोफर ब्रंस

23

पायथन में = = 3.6 आप प्रारूपित स्ट्रिंग शाब्दिक (f string) का उपयोग कर सकते हैं

query= f'''SELECT   action.descr as "action"
    role.id as role_id,
    role.descr as role
    FROM
    public.role_action_def,
    public.role,
    public.record_def,
    public.action
    WHERE role.id = role_action_def.role_id AND
    record_def.id = role_action_def.def_id AND
    action.id = role_action_def.action_id AND
    role_action_def.account_id = {account_id} AND
    record_def.account_id = {account_id} AND
    def_id = {def_id}'''

4
यदि मैं एक बहु-पंक्ति स्ट्रिंग के परिणाम को लॉग इन करना चाहता था और बाएं-किनारे के टैब / रिक्त स्थान नहीं दिखाए गए तो एक एफ-स्ट्रिंग कैसे काम करेगा?
कुआनब

7
अभी भी SQL इंजेक्शन के लिए असुरक्षित है
ट्रेंटन

19

उदाहरण के लिए:

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1={} "
       "and condition2={}").format(1, 2)

Output: 'select field1, field2, field3, field4 from table 
         where condition1=1 and condition2=2'

यदि शर्त का मूल्य एक स्ट्रिंग होना चाहिए, तो आप इस तरह कर सकते हैं:

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1='{0}' "
       "and condition2='{1}'").format('2016-10-12', '2017-10-12')

Output: "select field1, field2, field3, field4 from table where
         condition1='2016-10-12' and condition2='2017-10-12'"

13

मैं यहाँtextwrap.dedent वर्णित के रूप में लंबे तार के लिए सबसे अच्छा लगता है :

def create_snippet():
    code_snippet = textwrap.dedent("""\
        int main(int argc, char* argv[]) {
            return 0;
        }
    """)
    do_something(code_snippet)

1
मुझे काली स्लैश पसंद है जो ऑटो नई लाइन को रोकता है, बहुत बहुत धन्यवाद!
zyy

12

अन्य लोगों ने पहले से ही कोष्ठक विधि का उल्लेख किया है, लेकिन मैं उस कोष्ठक के साथ जोड़ना चाहूंगा, इनलाइन टिप्पणियों की अनुमति है।

प्रत्येक टुकड़े पर टिप्पणी:

nursery_rhyme = (
    'Mary had a little lamb,'          # Comments are great!
    'its fleece was white as snow.'
    'And everywhere that Mary went,'
    'her sheep would surely go.'       # What a pesky sheep.
)

निरंतरता के बाद टिप्पणी की अनुमति नहीं:

बैकस्लैश लाइन निरंतरता ( \) का उपयोग करते समय , टिप्पणियों की अनुमति नहीं है। आपको एक SyntaxError: unexpected character after line continuation characterत्रुटि प्राप्त होगी ।

nursery_rhyme = 'Mary had a little lamb,' \  # These comments
    'its fleece was white as snow.'       \  # are invalid!
    'And everywhere that Mary went,'      \
    'her sheep would surely go.'
# => SyntaxError: unexpected character after line continuation character

Regex स्ट्रिंग्स के लिए बेहतर टिप्पणियां:

से उदाहरण के आधार पर https://docs.python.org/3/library/re.html#re.VERBOSE ,

a = re.compile(
    r'\d+'  # the integral part
    r'\.'   # the decimal point
    r'\d*'  # some fractional digits
)
# Using VERBOSE flag, IDE usually can't syntax highight the string comment.
a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)

10

मैं व्यक्तिगत रूप से पायथन में कच्चे एसक्यूएल प्रश्नों को लिखने के लिए सबसे अच्छा (सरल, सुरक्षित और पाइथोनिक) तरीका ढूंढता हूं, खासकर जब पायथन के स्केलाइट 3 मॉड्यूल का उपयोग कर रहा हो :

query = '''
    SELECT
        action.descr as action,
        role.id as role_id,
        role.descr as role
    FROM
        public.role_action_def,
        public.role,
        public.record_def,
        public.action
    WHERE
        role.id = role_action_def.role_id
        AND record_def.id = role_action_def.def_id
        AND action.id = role_action_def.action_id
        AND role_action_def.account_id = ?
        AND record_def.account_id = ?
        AND def_id = ?
'''
vars = (account_id, account_id, def_id)   # a tuple of query variables
cursor.execute(query, vars)   # using Python's sqlite3 module

पेशेवरों

  • नीट एंड सिंपल कोड (पायथोनिक!)
  • SQL इंजेक्शन से सुरक्षित
  • अजगर 2 और अजगर 3 दोनों के साथ संगत (यह सब के बाद अजगर है)
  • कोई स्ट्रिंग संयोजन की आवश्यकता नहीं है
  • यह सुनिश्चित करने की आवश्यकता नहीं है कि प्रत्येक पंक्ति का सही-सबसे चरित्र एक स्थान है

विपक्ष

  • चूंकि क्वेरी में चर को ?प्लेसहोल्डर द्वारा प्रतिस्थापित किया जाता है , इसलिए यह ट्रैक करना थोड़ा मुश्किल हो सकता है कि इसे ?किस पायथन वेरिएबल द्वारा प्रतिस्थापित किया जाए, जब क्वेरी में बहुत सारे हैं।

ध्यान दें, मैंने इसका परीक्षण नहीं किया है, लेकिन आप संभवतः संबंधित स्थानों में "{0} {1} {2}" के साथ प्रतिस्थापित करके और फिर अंतिम पंक्ति को बदलकर प्रश्न चिह्न भ्रम से बच सकते हैं cursor.execute(query.format(vars))। आपको अपने एकमात्र "कोन" (मुझे आशा है) का ध्यान रखना चाहिए।
बेन

हाँ, का उपयोग formatकरना अच्छा होगा , लेकिन मुझे यकीन नहीं है कि क्वेरी स्ट्रिंग एसक्यूएल इंजेक्शन से सुरक्षित होगी।
फहील

हाँ, यह एक उचित बिंदु है और यह निश्चित रूप से थोड़ा मुश्किल हो सकता है। शायद पूरी तरह से व्यय योग्य किसी चीज पर इसका परीक्षण करना बुद्धिमानी होगी ... इसमें कोई संदेह नहीं है कि एक COMP। विज्ञान। अंडरगार्मेंट काफी पहले ही भटक जाएगा। ;)
बेन

2
@ अगर आप cursor.execute(query.format(vars))तैयार कथनों से लाभ नहीं उठाते हैं तो आप कई तरह की समस्याओं की चपेट में हैं, इस तथ्य से शुरू होता है कि यदि पैरामीटर सिर्फ संख्या नहीं हैं, तो आपको SQL क्वेरी में उन्हें दोहरे उद्धरण चिह्नों की आवश्यकता होगी।
पैट्रिक मेवजेक

4

मैं आमतौर पर कुछ इस तरह का उपयोग करता हूं:

text = '''
    This string was typed to be a demo
    on how could we write a multi-line
    text in Python.
'''

यदि आप प्रत्येक पंक्ति में कष्टप्रद रिक्त स्थान हटाना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:

text = '\n'.join(line.lstrip() for line in text.splitlines())

2
पायथन के textwrap.dedentकार्य को देखें, जो मानक पुस्तकालय में है, इसमें आपके लिए आवश्यक कार्यक्षमता है।
bjd2385

@ bjd2385: inspect.cleandocथोड़ा अच्छा है (खुले उद्धरण के रूप में एक ही पंक्ति पर पाठ प्रकट होता है या नहीं, इसके बारे में कम सूक्ष्मता से स्पष्ट पंक्ति निरंतरता वर्णों की आवश्यकता नहीं होती है)।
शैडो रेंजर

3

आपका वास्तविक कोड काम नहीं करना चाहिए, तो आप "लाइनों" के अंत में व्हाइटस्पेस याद कर रहे हैं (जैसे: role.descr as roleFROM...)

मल्टीलाइन स्ट्रिंग के लिए तिगुना भाग है:

string = """line
  line2
  line3"""

इसमें लाइन ब्रेक और अतिरिक्त स्थान होंगे, लेकिन SQL के लिए यह समस्या नहीं है।


3

आप एक अलग फ़ाइल में sql-statement भी रख सकते हैं action.sqlऔर इसे py फ़ाइल में लोड कर सकते हैं

with open('action.sql') as f:
   query = f.read()

तो एसक्यूएल-बयानों को अजगर कोड से अलग किया जाएगा। यदि sql स्टेटमेंट में ऐसे पैरामीटर हैं, जिन्हें अजगर से भरने की आवश्यकता है, तो आप स्ट्रिंग फॉर्मेटिंग का उपयोग कर सकते हैं (जैसे% s या {फ़ील्ड})


3

"Is ला" स्काला तरीका (लेकिन मुझे लगता है कि OQ मांगों के रूप में सबसे अधिक पायथोनिक तरीका है):

description = """
            | The intention of this module is to provide a method to 
            | pass meta information in markdown_ header files for 
            | using it in jinja_ templates. 
            | 
            | Also, to provide a method to use markdown files as jinja 
            | templates. Maybe you prefer to see the code than 
            | to install it.""".replace('\n            | \n','\n').replace('            | ',' ')

यदि आप जंप लाइनों के बिना अंतिम स्ट्रगल चाहते हैं, तो बस \nदूसरे के पहले तर्क की शुरुआत में रखें:

.replace('\n            | ',' ')`.

नोट: "... टेम्पलेट्स" के बीच की सफेद रेखा। और "इसके अलावा, ..." के बाद एक व्हाट्सएप की आवश्यकता है |


3

tl; dr: का प्रयोग करें """\और """स्ट्रिंग को लपेटने के लिए , जैसे कि

string = """\
This is a long string
spanning multiple lines.
"""

से आधिकारिक अजगर प्रलेखन :

स्ट्रिंग लिटरल्स कई लाइनों को फैला सकते हैं। एक तरीका ट्रिपल-कोट्स का उपयोग कर रहा है: "" "..." "" या '' '...' ''। पंक्तियों का अंत स्वचालित रूप से स्ट्रिंग में शामिल है, लेकिन पंक्ति के अंत में एक \ _ जोड़कर इसे रोकना संभव है। निम्न उदाहरण:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

निम्नलिखित आउटपुट का उत्पादन करता है (ध्यान दें कि प्रारंभिक नई रेखा शामिल नहीं है):

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

2

अरे कुछ इस तरह की उम्मीद करो यह काम करता है, जैसे इस प्रारूप में यह आपको एक निरंतर रेखा लौटाएगा जैसे आपने इस संपत्ति के बारे में सफलतापूर्वक पूछताछ की है '

"message": f'you have successfully inquired about '
           f'{enquiring_property.title} Property owned by '
           f'{enquiring_property.client}'

1

मैं जटिल SQL क्वेरी बनाने के लिए एक पुनरावर्ती फ़ंक्शन का उपयोग करता हूं। कोड पठनीयता को बनाए रखते हुए इस तकनीक का उपयोग आम तौर पर बड़े तार बनाने के लिए किया जा सकता है।

# Utility function to recursively resolve SQL statements.
# CAUTION: Use this function carefully, Pass correct SQL parameters {},
# TODO: This should never happen but check for infinite loops
def resolveSQL(sql_seed, sqlparams):
    sql = sql_seed % (sqlparams)
    if sql == sql_seed:
        return ' '.join([x.strip() for x in sql.split()])
    else:
        return resolveSQL(sql, sqlparams)

पुनश्च: यदि आवश्यक हो तो एसक्यूएल प्रश्नों को प्रिंट करने के लिए भयानक अजगर-स्क्वैल्पर्स लाइब्रेरी पर एक नज़र डालें। http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format


"पुनरावर्ती कार्य" को लैम्ब्डा नहीं कहा जाता है?
m3nda

1

एक अन्य विकल्प जो मुझे लगता है कि कोड (जैसे चर) इंडेंट होने पर अधिक पठनीय होता है और आउटपुट स्ट्रिंग एक लाइनर (कोई नई पंक्ति नहीं) होनी चाहिए:

def some_method():

    long_string = """
a presumptuous long string 
which looks a bit nicer 
in a text editor when
written over multiple lines
""".strip('\n').replace('\n', ' ')

    return long_string 

1

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

'''
Filename: practice.py
File creator: me
File purpose: explain triple quotes
'''


def example():
    """This prints a string that occupies multiple lines!!"""
    print("""
    This
    is 
    a multi-line
    string!
    """)

0

मुझे यह दृष्टिकोण पसंद है क्योंकि यह पढ़ने वाले विशेषाधिकार है। उन मामलों में जहां हमारे पास लंबे समय से तार हैं, कोई रास्ता नहीं है! इंडेंटेशन के स्तर पर निर्भर करता है और आप अभी भी प्रति वर्ण 80 वर्णों तक सीमित हैं ... खैर ... और कुछ कहने की आवश्यकता नहीं है। मेरे विचार में अजगर शैली के मार्गदर्शक अभी भी बहुत अस्पष्ट हैं। मैंने @Eero Aaltonen दृष्टिकोण लिया क्योंकि यह पढ़ने और सामान्य ज्ञान के विशेषाधिकार है। मैं समझता हूं कि स्टाइल गाइड को हमारी मदद करनी चाहिए और हमारे जीवन को गड़बड़ नहीं बनाना चाहिए। धन्यवाद!

class ClassName():
    def method_name():
        if condition_0:
            if condition_1:
                if condition_2:
                    some_variable_0 =\
"""
some_js_func_call(
    undefined, 
    {
        'some_attr_0': 'value_0', 
        'some_attr_1': 'value_1', 
        'some_attr_2': '""" + some_variable_1 + """'
    }, 
    undefined, 
    undefined, 
    true
)
"""

0

से आधिकारिक अजगर प्रलेखन :

स्ट्रिंग लिटरल्स कई लाइनों को फैला सकते हैं। एक तरीका ट्रिपल-कोट्स का उपयोग कर रहा है: "" "..." "" या '' '...' ''। पंक्तियों का अंत स्वचालित रूप से स्ट्रिंग में शामिल है, लेकिन पंक्ति के अंत में एक \ _ जोड़कर इसे रोकना संभव है। निम्न उदाहरण:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

निम्नलिखित आउटपुट का उत्पादन करता है (ध्यान दें कि प्रारंभिक नई रेखा शामिल नहीं है):


0

एक तानाशाही के अंदर एक लंबी स्ट्रिंग को परिभाषित करने के लिए, न्यूलाइन्स को बनाए रखते हुए लेकिन रिक्त स्थान को छोड़ते हुए , मैंने स्ट्रिंग को एक स्थिरांक में परिभाषित करते हुए समाप्त किया:

LONG_STRING = \
"""
This is a long sting
that contains newlines.
The newlines are important.
"""

my_dict = {
   'foo': 'bar',
   'string': LONG_STRING
}

0

पायथन में लंबे समय तक तार के लिए एक सामान्य दृष्टिकोण के रूप में आप ट्रिपल उद्धरण का उपयोग कर सकते हैं, splitऔर join:

_str = ' '.join('''Lorem ipsum dolor sit amet, consectetur adipiscing 
        elit, sed do eiusmod tempor incididunt ut labore et dolore 
        magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
        ullamco laboris nisi ut aliquip ex ea commodo.'''.split())

आउटपुट:

'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo.'

SQL क्वेरी से संबंधित OP के प्रश्न के संबंध में, नीचे दिए गए उत्तर में SQL क्वेरी के निर्माण के लिए इस दृष्टिकोण की शुद्धता की अवहेलना है और अतिरिक्त आयात के बिना केवल पठनीय और सौंदर्यपूर्ण तरीके से लंबे तारों के निर्माण पर ध्यान केंद्रित करता है। यह कम्प्यूटेशनल लोड की भी उपेक्षा करता है।

ट्रिपल उद्धरणों का उपयोग करते हुए हम एक लंबी और पठनीय स्ट्रिंग बनाते हैं, जिसे हम एक सूची में तोड़ते हैं, split()जिससे व्हाट्सएप को अलग किया जाता है और फिर इसे वापस एक साथ जोड़ दिया जाता है ' '.join()। अंत में हम format()कमांड का उपयोग करके वैरिएबल डालें :

account_id = 123
def_id = 321

_str = '''
    SELECT action.descr AS "action", role.id AS role_id, role.descr AS role 
    FROM public.role_action_def, public.role, public.record_def, public.action
    WHERE role.id = role_action_def.role_id 
    AND record_def.id = role_action_def.def_id 
    AND' action.id = role_action_def.action_id 
    AND role_action_def.account_id = {} 
    AND record_def.account_id = {} 
    AND def_id = {}
    '''

query = ' '.join(_str.split()).format(account_id, account_id, def_id)

पैदा करता है:

SELECT action.descr AS "action", role.id AS role_id, role.descr AS role FROM public.role_action_def, public.role, public.record_def, public.action WHERE role.id = role_action_def.role_id AND record_def.id = role_action_def.def_id AND\' action.id = role_action_def.action_id AND role_action_def.account_id = 123 AND record_def.account_id=123 AND def_id=321

संपादित करें: यह दृष्टिकोण PEP8 के अनुरूप नहीं है, लेकिन मुझे कई बार यह उपयोगी लगता है


-7

आम तौर पर, मैं मल्टी-लाइन टिप्पणियों / स्ट्रिंग का उपयोग करता हूं listऔर करता हूं join

lines = list()
lines.append('SELECT action.enter code here descr as "action", ')
lines.append('role.id as role_id,')
lines.append('role.descr as role')
lines.append('FROM ')
lines.append('public.role_action_def,')
lines.append('public.role,')
lines.append('public.record_def, ')
lines.append('public.action')
query = " ".join(lines)

आप इस सूची तत्व जैसे ' \n' (newline) या ' ,' (अल्पविराम) या '' में शामिल होने के लिए किसी भी स्ट्रिंग का उपयोग कर सकते हैं ' (स्थान) में

चीयर्स .. !!


1
आप कम से कम एक सरणी शाब्दिक का उपयोग क्यों नहीं करेंगे?
अलेक्जेंडर -

1
एरे को वर्ग सूची द्वारा दर्शाया जाता है। सरणी
शाब्दिकों के

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