Cara Pythonic untuk membuat string multi-line yang panjang

1307

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

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

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

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
Pablo Mescher
sumber
207
Karena contoh Anda terlihat seperti blok SQL yang menunggu serangan injeksi, saran lain adalah melihat ke perpustakaan SQL tingkat tinggi seperti SQLAlchemy atau sesuatu untuk menghindari peretasan bersama SQL mentah seperti ini. (Mungkin di luar topik, tetapi Anda memang meminta "Ada saran";)
John Gaines Jr
6
Ini adalah "cara Pythonic untuk membuat kode multi-line untuk string panjang" Untuk membuat string yang berisi baris baru lihat textwrap.dedent .
Bob Stein
8
@cezar Saya menulis pertanyaan ini lebih dari lima tahun yang lalu, tapi saya ingat itu muncul karena tidak tahu bagaimana cara menempatkan query sql panjang dengan benar dalam beberapa baris. Saya setuju saya melakukan hal-hal bodoh dengan string panjang itu, tapi itu bukan pertanyaan saya dan saya tidak cukup pintar untuk mencari contoh yang lebih baik untuk menggambarkannya yang tidak termasuk masalah injeksi sql.
Pablo Mescher
@cezar tidak, ini bukan masalah XY, permintaan akan lebih baik diformat dalam banyak baris dalam hal apa pun. SQLi tidak terkait dengan pertanyaan yang ada. Peringatan besar namun benar-benar dibenarkan :)
bugmenot123
Saya menulis paket kecil untuk ini. Contoh di sini: stackoverflow.com/a/56940938/1842491
Shay

Jawaban:

2229

Apakah Anda berbicara tentang string multi-line? Mudah, gunakan tiga kutipan 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 dari mereka tentu saja pada awal dan akhir) dan memperlakukan string yang dihasilkan sseperti string lainnya.

CATATAN : Seperti halnya string apa pun, apa pun di antara kutipan awal dan akhir menjadi bagian dari string, jadi contoh ini memiliki spasi kosong di depan (seperti yang ditunjukkan oleh @ root45). String ini juga akan berisi baris kosong dan baris baru.

Yaitu,:

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

Akhirnya, kita juga bisa membuat garis panjang dengan Python seperti ini:

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

yang tidak akan menyertakan tambahan kosong atau baris baru (ini adalah contoh yang disengaja 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 tanda kurung dan pastikan untuk memperhitungkan setiap blank dan baris baru yang diperlukan.

Levon
sumber
8
Saya lebih suka menggunakan operator "+" secara eksplisit untuk metode kedua. Tidak banyak kerumitan dan meningkatkan keterbacaan.
Marco Sulla
38
@LucasMalor String yang berdekatan adalah gabungan waktu kompilasi. Tidak menggunakan +operator untuk membuat penggabungan terjadi saat runtime?
Joshua Taylor
13
Untuk referensi, berikut adalah dokumen resmi untuk fenomena ini: docs.python.org/2/reference/… (python 2) dan docs.python.org/3/reference/… (python 3)
neverendingqs
4
Contoh Anda bagus, tapi saya berharap itu termasuk menunjukkan cara menanamkan data variabel dengan aman dan aman ke dalam kueri. Baik kode contoh OP dan @ jessee menunjukkan bagaimana TIDAK untuk melakukannya dengan benar (itu adalah undangan untuk serangan SQL). Lihat juga: dev.mysql.com/doc/connector-python/en/…
Scott Prive
2
Anda dapat menggunakan textwrap.dedentuntuk menghapus spasi kosong terkemuka yang tidak diinginkan. docs.python.org/3/library/textwrap.html#textwrap.dedent
Corey Goldberg
190

Jika Anda tidak menginginkan string multiline tetapi hanya memiliki string baris panjang, Anda dapat menggunakan tanda kurung, pastikan Anda tidak menyertakan koma di antara segmen string, maka itu akan menjadi tupel.

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 buat, string multiline juga akan baik-baik saja. Tetapi jika spasi putih string multiline akan berisi akan menjadi masalah, maka ini akan menjadi cara yang baik untuk mencapai apa yang Anda inginkan.

Jesse
sumber
1
@Pablo Anda bahkan dapat menambahkan komentar setelah,
Ashwini Chaudhary
@ 200OK maksudmu setelah ini '?
kon psych
3
Cara lain untuk memformat string ini adalah menambahkan .format(...)setelah kurung tutup. %membuat notasi juga harus berhasil, tetapi saya belum mencobanya
kon psych
3
Perhatikan bahwa setiap baris harus diakhiri dengan string konstan, jadi ' foo '+variabletidak akan berfungsi, tetapi ' foo '+variable+''akan.
yoyo
46
Contoh ini adalah pintu terbuka untuk serangan injeksi SQL. Tolong, tidak ada yang menggunakan ini pada aplikasi yang menghadap publik. Lihat dokumen MySQL untuk cara menggunakan 'placeholder': dev.mysql.com/doc/connector-python/en/…
Scott Prive
138

Memecah garis oleh \pekerjaan untukku. Berikut ini sebuah contoh:

longStr = "This is a very long string " \
        "that I wrote to help somebody " \
        "who had a question about " \
        "writing long strings in Python"
amfibi
sumber
9
Saya lebih suka notasi kutipan rangkap atau membungkus dalam () ke karakter \
Khanh Hua
15
Saya sangat menyarankan untuk meletakkan spasi di awal baris berikut daripada di akhir baris yang diikuti. Cara yang tidak sengaja hilang ini jauh lebih jelas (dan dengan demikian kecil kemungkinannya terjadi).
Alfe
Juga bekerja dengan variabel di akhir barislongStr = "account: " + account_id + \ ...
frmbelz
Saya mendapatkan kesalahan berikut: the backslash is redundant between bracketsketika saya menulis di dalamprint()
alper
50

Saya merasa senang dengan yang ini:

string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')
Eero Aaltonen
sumber
32
Tidak setuju. Bagaimana jika baris pertama ("string = ...") diberi indentasi berat? Kita harus menghapus baris berikut ke nol indentasi, yang terlihat jelek di tengah-tengah blok yang indentasi.
xjcl
1
Yah, sebagian besar string panjang saya terjadi di tingkat modul, di mana ini cocok. Dalam kasus Anda, ini jelas bukan solusi terbaik.
Eero Aaltonen
1
Saya suka pendekatan ini karena itu hak istimewa membaca. Dalam kasus di mana kami memiliki string panjang tidak ada cara ... Tergantung pada tingkat lekukan Anda dan masih terbatas pada 80 karakter per baris ... Yah ... Tidak perlu mengatakan apa pun. Dalam pandangan saya panduan gaya python masih sangat kabur. Terima kasih!
Eduardo Lucio
Ini akan sangat jelek jika digunakan di bawah modul, saya juga harus.replace('\t','')
alper
44

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

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

Yang disarankan Levon itu baik, tetapi mungkin rentan terhadap kesalahan:

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

query == "SELECT fooFROM barWHERE baz"  # probably not what you want
darkfeline
sumber
8
+1 Meringankan peninjau kode dari keharusan memeriksa dengan cermat ujung kanan setiap baris untuk spasi kosong yang tidak memadai . OP melakukan kesalahan ini beberapa kali, seperti dicatat oleh @KarolyHorvath.
Bob Stein
2
Saat meninjau string multiline yang dikodekan dengan cara yang sama, saya memerlukan ruang kosong yang memadai di ujung kiri setiap baris untuk konfirmasi yang mudah.
Payung
3
Ulasan @ BobStein-VisiBone Code tidak boleh tentang kesalahan sintaks atau bug kecil seperti ini, mereka harus tentang substansi. Jika seseorang memasang kode untuk ditinjau yang memiliki kesalahan sintaks (dan karenanya tidak akan berjalan sama sekali atau dalam situasi tertentu) maka ada sesuatu yang sangat salah. Tidak sulit menjalankan serat sebelum Anda berkomitmen. Jika orang tersebut tidak memperhatikan program mereka tidak berjalan dengan benar karena mereka membuat kesalahan yang jelas, mereka tidak boleh melakukan.
Charles Addis
1
@CharlesAddis yang disetujui, ulasan kode harus dilakukan setelah metode otomatis, mis. Serat, penyorotan sintaks, dll. Namun beberapa bug yang hilang ruang putih mungkin tidak ditangkap dengan cara itu. Berikan diri Anda semua keuntungan yang wajar dalam menjaga bug, saya sarankan.
Bob Stein
33

Anda juga dapat menggabungkan variabel ketika 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)
gjgjgj
sumber
26

Pendekatan ini menggunakan:

  • cukup satu backslash untuk menghindari pemberian baris awal
  • hampir tidak ada tanda baca internal dengan menggunakan string yang dikutip tiga
  • melepaskan indentasi lokal menggunakan modul textwrap inspect
  • menggunakan python 3.6 interpolasi string yang diformat ('f') untuk account_iddan def_idvariabel.

Cara ini terlihat paling pythonic bagi saya.

# 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}'''
)

Pembaruan : 1/29/2019 Sertakan saran @ ShadowRanger untuk digunakan inspect.cleandocsebagai gantitextwrap.dedent

Christopher Bruns
sumber
5
Catatan: inspect.cleandocsedikit lebih baik daripada textwrap.dedent, karena tidak memerlukan baris pertama kosong dengan karakter kelanjutan garis di akhir.
ShadowRanger
2
@ShadowRanger Wow saya tidak pernah menggunakan cleandoc sebelumnya. Saya memperbarui jawaban saya dan nantinya akan digunakan inspect.cleandocuntuk ini.
Christopher Bruns
23

Dalam Python> = 3,6 Anda dapat menggunakan string string yang diformat (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}'''
Vlad Bezden
sumber
4
Bagaimana cara kerja f-string jika saya ingin mencatat hasil dari string multi-line dan tidak memiliki tab / spasi sisi kiri yang ditampilkan?
kuanb
7
Masih rentan terhadap injeksi SQL
Trenton
19

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 melakukannya 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'"
pangpang
sumber
13

Saya menemukan textwrap.dedentyang terbaik untuk string panjang seperti yang dijelaskan di sini :

def create_snippet():
    code_snippet = textwrap.dedent("""\
        int main(int argc, char* argv[]) {
            return 0;
        }
    """)
    do_something(code_snippet)
fredrik
sumber
1
Saya suka garis miring hitam yang mencegah jalur baru otomatis, terima kasih banyak!
zyy
12

Orang lain telah menyebutkan metode kurung, tetapi saya ingin menambahkan bahwa dengan tanda kurung, komentar inline diperbolehkan.

Komentari setiap fragmen:

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.
)

Komentar tidak diizinkan setelah kelanjutan:

Saat menggunakan lanjutan garis garis miring terbalik ( \), komentar tidak diperbolehkan. Anda akan menerima SyntaxError: unexpected character after line continuation characterkesalahan.

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

Komentar yang lebih baik untuk string Regex:

Berdasarkan contoh dari 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)
ddrscott
sumber
10

Saya pribadi menemukan yang berikut ini sebagai cara terbaik (sederhana, aman dan Pythonic) untuk menulis query SQL mentah dalam Python, terutama ketika 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 (lagunya Pythonic)
  • Tidak perlu penggabungan string
  • Tidak perlu memastikan bahwa karakter paling kanan dari setiap baris adalah spasi

Cons

  • Karena variabel dalam kueri diganti oleh ?placeholder, mungkin akan sedikit sulit untuk melacak yang ?harus diganti oleh variabel Python mana ketika ada banyak dari mereka dalam kueri.
Faheel
sumber
Catatan, saya belum menguji ini, tetapi Anda mungkin dapat menghindari kebingungan tanda tanya dengan menggantinya dengan "{0} {1} {2}" di tempat yang relevan dan kemudian mengubah baris terakhir ke cursor.execute(query.format(vars)). Itu harus mengurus satu-satunya "penipu" Anda (saya harap).
Ben
Ya, menggunakan formatakan menyenangkan tetapi saya tidak yakin apakah string kueri yang diformat seperti itu akan aman dari injeksi SQL.
Faheel
Ya, itu poin yang adil dan tentu saja bisa sedikit rumit. Mungkin mengujinya pada sesuatu yang sepenuhnya dapat dihabiskan akan menjadi bijaksana ... tidak diragukan lagi Comp. Sci. sarjana akan berkeliaran segera. ;)
Ben
2
@Ben jika Anda melakukannya, cursor.execute(query.format(vars))Anda tidak mendapat untung dari pernyataan yang disiapkan lagi sehingga Anda rentan terhadap berbagai jenis masalah, dimulai dengan fakta bahwa jika parameternya bukan hanya angka, Anda perlu menggandakan penawaran dalam kueri SQL.
Patrick Mevzek
4

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 dapat melakukan hal berikut:

text = '\n'.join(line.lstrip() for line in text.splitlines())
Israel Barth Rubio
sumber
2
Lihatlah textwrap.dedentfungsi Python , yang ada di perpustakaan standar, ia memiliki fungsi yang Anda butuhkan.
bjd2385
@ bjd2385: inspect.cleandocsedikit lebih baik (kurang rewel tentang apakah teks muncul pada baris yang sama dengan tanda kutip terbuka, tidak memerlukan karakter kelanjutan garis eksplisit).
ShadowRanger
3

Kode aktual Anda tidak harus bekerja, Anda akan 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 tambahan, tetapi untuk SQL itu tidak masalah.

Karoly Horvath
sumber
3

Anda juga dapat menempatkan pernyataan sql dalam file terpisah action.sqldan memuatnya dalam file py

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

Jadi pernyataan sql akan dipisahkan dari kode python. Jika ada parameter dalam pernyataan sql yang perlu diisi dari python, Anda dapat menggunakan pemformatan string (seperti% s atau {field})

mrijken
sumber
3

"À la" Scala cara (tapi saya pikir adalah cara yang paling pythonic sebagai tuntutan 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('            | ',' ')

Jika Anda ingin str akhir tanpa garis lompat, cukup masukkan \ndi awal argumen pertama dari ganti kedua:

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

Catatan: garis putih antara "... templat." dan "Juga, ..." membutuhkan spasi setelah |.

menang
sumber
3

tl; dr: Gunakan """\dan """untuk membungkus string , seperti pada

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

Dari dokumentasi python resmi :

Literal string dapat menjangkau beberapa baris. Salah satu caranya adalah dengan menggunakan tanda kutip tiga: "" "..." "" atau '' '...' ''. Akhir baris secara otomatis termasuk dalam string, tetapi dimungkinkan untuk mencegahnya dengan menambahkan \ di akhir baris. Contoh berikut:

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

menghasilkan output berikut (perhatikan bahwa baris awal awal tidak termasuk):

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

Hai coba sesuatu seperti ini semoga berhasil, seperti dalam format ini akan mengembalikan Anda garis berkelanjutan seperti Anda telah berhasil menanyakan tentang properti ini`

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

Saya menggunakan fungsi rekursif untuk membangun Query SQL yang kompleks. Teknik ini umumnya dapat digunakan untuk membangun string besar sambil mempertahankan keterbacaan kode.

# 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)

PS: Lihatlah perpustakaan python-sqlparse yang mengagumkan untuk mencetak pertanyaan SQL yang cukup jika diperlukan. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format

Sandeep
sumber
"fungsi rekursif" bukankah itu disebut lambda?
m3nda
1

Pilihan lain yang saya pikir lebih mudah dibaca ketika kode (misalnya variabel) diindentasi dan string output harus menjadi satu liner (tidak ada baris baru):

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 
Eyal Levin
sumber
1

Gunakan tiga tanda kutip. Orang sering menggunakan ini untuk membuat dokumen pada awal program untuk menjelaskan tujuan mereka dan informasi lain yang relevan dengan pembuatannya. Orang-orang juga menggunakan fungsi-fungsi ini untuk menjelaskan tujuan dan penerapan fungsi. Contoh:

'''
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!
    """)
Joshua Hall
sumber
0

Saya suka pendekatan ini karena itu hak istimewa membaca. Dalam kasus di mana kita memiliki string panjang, tidak mungkin! Tergantung pada tingkat lekukan Anda dan masih terbatas pada 80 karakter per baris ... Ya ... Tidak perlu mengatakan apa pun. Dalam pandangan saya panduan gaya python masih sangat kabur. Saya mengambil pendekatan @Eero Aaltonen karena itu hak istimewa membaca dan akal sehat. Saya mengerti bahwa panduan gaya harus membantu kita dan tidak membuat hidup kita berantakan. Terima kasih!

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
)
"""
Eduardo Lucio
sumber
0

Dari dokumentasi python resmi :

Literal string dapat menjangkau beberapa baris. Salah satu caranya adalah dengan menggunakan tanda kutip tiga: "" "..." "" atau '' '...' ''. Akhir baris secara otomatis termasuk dalam string, tetapi dimungkinkan untuk mencegahnya dengan menambahkan \ di akhir baris. Contoh berikut:

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

menghasilkan output berikut (perhatikan bahwa baris awal awal tidak termasuk):

Mengalir
sumber
0

Untuk mendefinisikan string panjang di dalam dict, menjaga baris baru tetapi menghilangkan spasi , saya akhirnya mendefinisikan string dalam konstanta seperti ini:

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

my_dict = {
   'foo': 'bar',
   'string': LONG_STRING
}
flix
sumber
0

Sebagai pendekatan umum untuk string panjang dalam Python Anda dapat menggunakan tanda kutip tiga, splitdan 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())

Keluaran:

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

Berkenaan dengan pertanyaan OP terkait dengan query SQL, jawaban di bawah ini mengabaikan kebenaran pendekatan ini untuk membangun query SQL dan hanya berfokus pada membangun string panjang dengan cara yang dapat dibaca dan estetika tanpa tambahan impor. Ini juga mengabaikan beban komputasi yang diperlukan.

Dengan menggunakan tanda kutip tiga, kami membuat string yang panjang dan mudah dibaca yang kemudian kami bagi menjadi daftar menggunakan split()dengan demikian mengupas spasi dan kemudian bergabung kembali bersama ' '.join(). Akhirnya kita memasukkan variabel menggunakan format()perintah:

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)

Menghasilkan:

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

Sunting: Pendekatan ini tidak sejalan dengan PEP8 tetapi saya merasa hal ini berguna sesekali

Rasmus Groth
sumber
-7

Secara umum, saya menggunakan listdan joinuntuk komentar / string multi-line.

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)

Anda dapat menggunakan string apa pun untuk bergabung dengan semua elemen daftar ini seperti ' \n' (baris baru) atau ' ,' (koma) atau ' ' (spasi)

Bersulang..!!

paone
sumber
1
Mengapa Anda setidaknya tidak menggunakan array literal?
Alexander - Reinstate Monica
1
Array diwakili oleh daftar kelas. lihat diskusi lain tentang array literal
paone
Saya kira ini berhasil, tetapi Anda harus berpikir tentang kinerja dan keterbacaan ...
Petro