Pertanyaan Pythonic cara untuk membuat string multi-garis panjang


Saya memiliki pertanyaan yang sangat panjang. Saya ingin membaginya dalam beberapa baris dengan Python. Cara untuk melakukannya dalam JavaScript akan menggunakan beberapa kalimat dan menggabungkannya dengan + Operator (saya tahu, mungkin itu bukan cara yang paling efisien untuk melakukannya, tapi saya tidak terlalu peduli tentang kinerja dalam tahap ini, hanya membaca kode). Contoh:

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

Saya mencoba melakukan sesuatu yang mirip dengan Python, tetapi tidak berhasil, jadi saya menggunakannya \ untuk membagi string panjang. Namun, saya tidak yakin apakah ini adalah satu-satunya cara / terbaik / pythonicest untuk melakukannya. Itu terlihat canggung. Kode yang sebenarnya:

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

778
2018-05-18 22:21


asal


Jawaban:


Apakah Anda berbicara tentang string multi-baris? Mudah, gunakan tanda kutip tiga untuk memulai dan mengakhirinya.

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

Anda dapat menggunakan tanda kutip tunggal juga (3 diantaranya tentu saja pada awal dan akhir) dan memperlakukan string yang dihasilkan s sama seperti string lainnya.

CATATAN: Sama seperti string apa pun, apa pun di antara tanda kutip awal dan akhir menjadi bagian dari string, jadi contoh ini memiliki kosong utama (seperti yang ditunjukkan oleh @ root45). String ini juga akan berisi kosong dan baris baru.

Yaitu.,:

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

Akhirnya, seseorang juga dapat membangun garis panjang dengan Python seperti ini:

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

yang mana akan tidak termasuk tambahan kosong atau baris baru (ini adalah contoh yang disengaja yang menunjukkan apa efek dari melewatkan kosong akan menghasilkan):

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

Tidak ada koma yang diperlukan, cukup tempatkan string untuk digabungkan menjadi sepasang kurung dan pastikan untuk memperhitungkan setiap kosong dan baris baru yang diperlukan.


1335
2018-05-18 22:22



Jika Anda tidak ingin string multiline tetapi hanya memiliki string garis panjang tunggal, Anda dapat menggunakan tanda kurung, pastikan Anda tidak menyertakan koma di antara segmen string, maka itu akan menjadi tuple.

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)

Dalam pernyataan SQL seperti apa yang Anda kembangkan, string multiline juga akan baik-baik saja. Tetapi jika spasi ekstra string multilin akan mengandung masalah, maka ini akan menjadi cara yang baik untuk mencapai apa yang Anda inginkan.


125
2018-05-18 22:26



Memutuskan garis demi garis \ bekerja untukku. Berikut ini contohnya:

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

100
2018-06-20 16:16



Saya menemukan diri saya senang dengan yang satu ini:

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

34
2018-01-04 10:39



Saya menemukan bahwa ketika membangun string panjang, Anda biasanya melakukan sesuatu seperti membuat kueri SQL, dalam hal ini yang terbaik:

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

Apa yang disarankan Levon baik, tetapi mungkin rentan terhadap kesalahan:

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

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

27
2018-06-19 07:06



Anda juga dapat menggabungkan variabel saat menggunakan notasi "".

foo = '1234'

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

EDIT: Menemukan cara yang lebih baik, dengan nama params dan .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)

20
2017-10-06 22:33



Dengan Python> = 3,6 Anda dapat menggunakan String literal terformat (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}'''

14
2018-04-25 18:47



Sebagai contoh:

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'

jika nilai kondisi harus berupa string, Anda dapat melakukan seperti ini:

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'"

8
2018-05-12 12:05



Saya pribadi menemukan yang berikut ini sebagai cara terbaik (sederhana, aman, dan Pythonic) untuk menulis kueri SQL mentah dengan Python, terutama saat menggunakan Modul sqlite3 Python:

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

Pro

  • Kode rapi dan sederhana (Pythonic!)
  • Aman dari injeksi SQL
  • Kompatibel dengan Python 2 dan Python 3 (itu Pythonic setelah semua)
  • Tidak perlu penggabungan string
  • Tidak perlu memastikan bahwa karakter paling kanan dari setiap baris adalah spasi

Cons

  • Karena variabel dalam query digantikan oleh ? placeholder, mungkin menjadi sedikit sulit untuk melacaknya ? harus diganti dengan variabel Python ketika ada banyak dari mereka dalam query.

5
2017-11-14 19:16



Kode aktual Anda seharusnya tidak berfungsi, Anda kehilangan spasi putih di akhir "garis" (misalnya: role.descr as roleFROM...)

Ada triplequotes untuk string multiline:

string = """line
  line2
  line3"""

Ini akan berisi jeda baris dan spasi ekstra, tetapi untuk SQL itu tidak masalah.


3
2018-05-18 22:25



Saya biasanya menggunakan sesuatu seperti ini:

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

Jika Anda ingin menghapus ruang kosong yang mengganggu di setiap baris, Anda bisa melakukan hal berikut:

text = '\n'.join([line.lstrip() for line in text.split('\n')])

3
2018-06-21 17:36