Apa lekukan yang tepat untuk string multiline Python dalam suatu fungsi?
def method():
string = """line one
line two
line three"""
atau
def method():
string = """line one
line two
line three"""
atau sesuatu yang lain?
Tampaknya agak aneh memiliki string yang tergantung di luar fungsi pada contoh pertama.
method.__doc__
tidak dimodifikasi oleh Python sendiri lebih daristr
literal lainnya .Jawaban:
Anda mungkin ingin berbaris dengan
"""
Karena baris baru dan spasi termasuk dalam string itu sendiri, Anda harus mempostingnya. Jika Anda tidak ingin melakukan itu dan Anda memiliki banyak teks, Anda mungkin ingin menyimpannya secara terpisah dalam file teks. Jika file teks tidak berfungsi dengan baik untuk aplikasi Anda dan Anda tidak ingin memposting, saya mungkin akan menggunakannya
Jika Anda ingin memposting proses multi-string untuk memangkas bagian-bagian yang tidak Anda butuhkan, Anda harus mempertimbangkan
textwrap
modul atau teknik untuk pemrosesan pascaproses yang disajikan dalam PEP 257 :sumber
trim()
berfungsi sebagai ditentukan dalam PEP257 diimplementasikan di perpustakaan standar sebagaiinspect.cleandoc
.string
menjaditext
atau apa pun dengan panjang yang berbeda, maka Anda sekarang perlu memperbarui lekukan dari setiap baris dari string multiline hanya untuk membuatnya cocok dengan yang"""
benar. Strategi lekukan tidak boleh menyulitkan refaktor / pemeliharaan di masa depan, dan itu adalah salah satu tempat yang PEP benar-benar gagalThe
textwrap.dedent
Fungsi memungkinkan seseorang untuk memulai dengan lekukan yang benar dalam sumber , dan kemudian strip itu dari teks sebelum digunakan.Pertukarannya, sebagaimana dicatat oleh beberapa orang lain, adalah bahwa ini adalah panggilan fungsi tambahan pada literal; memperhitungkan ini ketika memutuskan di mana menempatkan literal ini dalam kode Anda.
Trailing
\
dalam literal pesan log adalah untuk memastikan bahwa baris tidak ada dalam literal; dengan cara itu, literal tidak dimulai dengan baris kosong, dan sebaliknya mulai dengan baris penuh berikutnya.Nilai kembali dari
textwrap.dedent
adalah string input dengan semua indentasi spasi putih terkemuka yang umum dihapus pada setiap baris string. Jadi nilai di ataslog_message
adalah:sumber
textwrap.dedent()
panggilan adalah nilai konstan, sama seperti argumen inputnya.def foo: return foo.x
kemudian baris berikutnyafoo.x = textwrap.dedent("bar")
.Gunakan
inspect.cleandoc
seperti ini:Lekukan relatif akan dipertahankan seperti yang diharapkan. Seperti yang dikomentari di bawah ini, jika Anda ingin tetap menggunakan baris sebelumnya, gunakan
textwrap.dedent
. Namun itu juga menjaga jeda baris pertama.sumber
inspect.cleandoc
sudah ada sejak Python 2.6 , yaitu 2008 ..? Benar-benar jawaban terbersih, terutama karena itu tidak menggunakan gaya indentasi gantung, yang hanya membuang ruang yang tidak perluSatu opsi yang tampaknya hilang dari jawaban lain (hanya disebutkan jauh di dalam komentar oleh naxa) adalah sebagai berikut:
Ini akan memungkinkan penyelarasan yang tepat, bergabung dengan garis secara implisit, dan masih menjaga pergeseran garis yang, bagi saya, adalah salah satu alasan mengapa saya ingin tetap menggunakan string multiline.
Itu tidak memerlukan postprocessing apa pun, tetapi Anda perlu menambahkan secara manual
\n
di tempat tertentu yang Anda inginkan untuk mengakhiri garis. Baik sebaris atau sebagai string terpisah setelah. Yang terakhir lebih mudah untuk di-copy-paste.sumber
Beberapa opsi lagi. Di Ipython dengan pylab diaktifkan, dedent sudah ada di namespace. Saya memeriksa dan itu dari matplotlib. Atau dapat diimpor dengan:
Dalam dokumentasi itu menyatakan bahwa itu lebih cepat daripada yang setara dengan textwrap dan dalam tes saya di ipython memang 3 kali lebih cepat rata-rata dengan tes cepat saya. Ini juga memiliki keuntungan bahwa ia membuang setiap baris kosong terkemuka yang memungkinkan Anda untuk fleksibel dalam cara Anda membangun string:
Menggunakan dedikasi matplotlib pada ketiga contoh ini akan memberikan hasil yang masuk akal yang sama. Fungsi deduksi tulisan teks akan memiliki baris kosong terkemuka dengan contoh 1.
Kerugian yang jelas adalah bahwa textwrap di perpustakaan standar sementara matplotlib adalah modul eksternal.
Beberapa tradeoffs di sini ... fungsi dedent membuat kode Anda lebih mudah dibaca di mana string didefinisikan, tetapi membutuhkan pemrosesan nanti untuk mendapatkan string dalam format yang dapat digunakan. Dalam dokumentasi jelas bahwa Anda harus menggunakan indentasi yang benar karena sebagian besar penggunaan docstring akan melakukan pemrosesan yang diperlukan.
Ketika saya membutuhkan string yang tidak panjang dalam kode saya, saya menemukan kode jelek berikut ini di mana saya membiarkan string panjang keluar dari lekukan terlampir. Jelas gagal pada "Cantik lebih baik daripada jelek.", Tetapi orang bisa berpendapat bahwa itu lebih sederhana dan lebih eksplisit daripada alternatif yang ditentukan.
sumber
Jika Anda menginginkan solusi cepat & mudah dan menyelamatkan diri dari mengetik baris baru, Anda bisa memilih daftar, misalnya:
sumber
saya lebih memilih
atau
sumber
Dua sen saya, lepas dari garis akhir untuk mendapatkan indentasi:
sumber
Saya datang ke sini mencari 1-liner sederhana untuk menghapus / memperbaiki tingkat identifikasi dokumen untuk dicetak, tanpa membuatnya terlihat berantakan , misalnya dengan membuatnya "menggantung fungsi" di dalam skrip.
Inilah yang akhirnya saya lakukan:
Jelas, jika Anda membuat indentasi dengan spasi (mis. 4) alih-alih tombol tab gunakan sesuatu seperti ini sebagai gantinya:
Dan Anda tidak perlu menghapus karakter pertama jika Anda suka dokumen Anda terlihat seperti ini sebagai gantinya:
sumber
Opsi pertama adalah yang baik - dengan lekukan disertakan. Itu dalam gaya python - memberikan keterbacaan untuk kode.
Untuk menampilkannya dengan benar:
sumber
Tergantung bagaimana Anda ingin teks ditampilkan. Jika Anda ingin semuanya disejajarkan dengan kiri maka formatlah seperti pada cuplikan pertama atau beralih melalui garis-garis kiri-memangkas semua ruang.
sumber
Untuk string, Anda bisa setelah memproses string. Untuk dokumentasi Anda perlu setelah memproses fungsi sebagai gantinya. Inilah solusi untuk keduanya yang masih bisa dibaca.
sumber
inspect.cleandoc
- yang melakukan ini dengan cara yang benar.Saya mengalami masalah yang sama, kode menjadi sangat tidak dapat dibaca menggunakan multilines, saya keluar dengan sesuatu seperti
ya, pada awalnya bisa terlihat mengerikan tetapi sintaks yang tertanam cukup kompleks dan menambahkan sesuatu di akhir (seperti '\ n "') bukan solusi
sumber
Anda dapat menggunakan fungsi ini trim_indent .
Hasil:
sumber