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
python
string
multiline
multilinestring
Pablo Mescher
sumber
sumber
Jawaban:
Apakah Anda berbicara tentang string multi-line? Mudah, gunakan tiga kutipan untuk memulai dan mengakhirinya.
Anda dapat menggunakan tanda kutip tunggal juga (3 dari mereka tentu saja pada awal dan akhir) dan memperlakukan string yang dihasilkan
s
seperti 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,:
Akhirnya, kita juga bisa membuat garis panjang dengan Python seperti ini:
yang tidak akan menyertakan tambahan kosong atau baris baru (ini adalah contoh yang disengaja menunjukkan apa efek dari melewatkan kosong akan menghasilkan):
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.
sumber
+
operator untuk membuat penggabungan terjadi saat runtime?textwrap.dedent
untuk menghapus spasi kosong terkemuka yang tidak diinginkan. docs.python.org/3/library/textwrap.html#textwrap.dedentJika 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.
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.
sumber
,
'
?.format(...)
setelah kurung tutup.%
membuat notasi juga harus berhasil, tetapi saya belum mencobanya' foo '+variable
tidak akan berfungsi, tetapi' foo '+variable+''
akan.Memecah garis oleh
\
pekerjaan untukku. Berikut ini sebuah contoh:sumber
longStr = "account: " + account_id + \ ...
the backslash is redundant between brackets
ketika saya menulis di dalamprint()
Saya merasa senang dengan yang ini:
sumber
.replace('\t','')
Saya menemukan bahwa ketika membangun string panjang, Anda biasanya melakukan sesuatu seperti membangun query SQL, dalam hal ini yang terbaik:
Yang disarankan Levon itu baik, tetapi mungkin rentan terhadap kesalahan:
sumber
Anda juga dapat menggabungkan variabel ketika menggunakan "" notasi:
EDIT: Menemukan cara yang lebih baik, dengan nama params dan .format ():
sumber
Pendekatan ini menggunakan:
cukup satu backslash untuk menghindari pemberian baris awaltextwrapinspect
account_id
dandef_id
variabel.Cara ini terlihat paling pythonic bagi saya.
Pembaruan : 1/29/2019 Sertakan saran @ ShadowRanger untuk digunakan
inspect.cleandoc
sebagai gantitextwrap.dedent
sumber
inspect.cleandoc
sedikit lebih baik daripadatextwrap.dedent
, karena tidak memerlukan baris pertama kosong dengan karakter kelanjutan garis di akhir.inspect.cleandoc
untuk ini.Dalam Python> = 3,6 Anda dapat menggunakan string string yang diformat (f string)
sumber
Sebagai contoh:
jika nilai kondisi harus berupa string, Anda dapat melakukannya seperti ini:
sumber
Saya menemukan
textwrap.dedent
yang terbaik untuk string panjang seperti yang dijelaskan di sini :sumber
Orang lain telah menyebutkan metode kurung, tetapi saya ingin menambahkan bahwa dengan tanda kurung, komentar inline diperbolehkan.
Komentari setiap fragmen:
Komentar tidak diizinkan setelah kelanjutan:
Saat menggunakan lanjutan garis garis miring terbalik (
\
), komentar tidak diperbolehkan. Anda akan menerimaSyntaxError: unexpected character after line continuation character
kesalahan.Komentar yang lebih baik untuk string Regex:
Berdasarkan contoh dari https://docs.python.org/3/library/re.html#re.VERBOSE ,
sumber
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 :
Pro
Cons
?
placeholder, mungkin akan sedikit sulit untuk melacak yang?
harus diganti oleh variabel Python mana ketika ada banyak dari mereka dalam kueri.sumber
cursor.execute(query.format(vars))
. Itu harus mengurus satu-satunya "penipu" Anda (saya harap).format
akan menyenangkan tetapi saya tidak yakin apakah string kueri yang diformat seperti itu akan aman dari injeksi SQL.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.Saya biasanya menggunakan sesuatu seperti ini:
Jika Anda ingin menghapus ruang kosong yang mengganggu di setiap baris, Anda dapat melakukan hal berikut:
sumber
textwrap.dedent
fungsi Python , yang ada di perpustakaan standar, ia memiliki fungsi yang Anda butuhkan.inspect.cleandoc
sedikit lebih baik (kurang rewel tentang apakah teks muncul pada baris yang sama dengan tanda kutip terbuka, tidak memerlukan karakter kelanjutan garis eksplisit).Kode aktual Anda tidak harus bekerja, Anda akan kehilangan spasi putih di akhir "garis" (misalnya:
role.descr as roleFROM...
)Ada triplequotes untuk string multiline:
Ini akan berisi jeda baris dan spasi tambahan, tetapi untuk SQL itu tidak masalah.
sumber
Anda juga dapat menempatkan pernyataan sql dalam file terpisah
action.sql
dan memuatnya dalam file pyJadi 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})
sumber
"À la" Scala cara (tapi saya pikir adalah cara yang paling pythonic sebagai tuntutan OQ):
Jika Anda ingin str akhir tanpa garis lompat, cukup masukkan
\n
di awal argumen pertama dari ganti kedua:Catatan: garis putih antara "... templat." dan "Juga, ..." membutuhkan spasi setelah
|
.sumber
tl; dr: Gunakan
"""\
dan"""
untuk membungkus string , seperti padaDari dokumentasi python resmi :
sumber
Hai coba sesuatu seperti ini semoga berhasil, seperti dalam format ini akan mengembalikan Anda garis berkelanjutan seperti Anda telah berhasil menanyakan tentang properti ini`
sumber
Saya menggunakan fungsi rekursif untuk membangun Query SQL yang kompleks. Teknik ini umumnya dapat digunakan untuk membangun string besar sambil mempertahankan keterbacaan kode.
PS: Lihatlah perpustakaan python-sqlparse yang mengagumkan untuk mencetak pertanyaan SQL yang cukup jika diperlukan. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
sumber
Pilihan lain yang saya pikir lebih mudah dibaca ketika kode (misalnya variabel) diindentasi dan string output harus menjadi satu liner (tidak ada baris baru):
sumber
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:
sumber
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!
sumber
Dari dokumentasi python resmi :
sumber
Untuk mendefinisikan string panjang di dalam dict, menjaga baris baru tetapi menghilangkan spasi , saya akhirnya mendefinisikan string dalam konstanta seperti ini:
sumber
Sebagai pendekatan umum untuk string panjang dalam Python Anda dapat menggunakan tanda kutip tiga,
split
danjoin
:Keluaran:
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 menggunakanformat()
perintah:Menghasilkan:
Sunting: Pendekatan ini tidak sejalan dengan PEP8 tetapi saya merasa hal ini berguna sesekali
sumber
Secara umum, saya menggunakan
list
danjoin
untuk komentar / string multi-line.Anda dapat menggunakan string apa pun untuk bergabung dengan semua elemen daftar ini seperti '
\n
' (baris baru) atau ',
' (koma) atau '' (spasi)
Bersulang..!!
sumber