Bagaimana saya bisa melakukan jeda baris (line continuation) dengan Python?

1076

Saya memiliki garis panjang kode yang ingin saya bagi di antara beberapa baris. Apa yang saya gunakan dan apa sintaksinya?

Misalnya, menambahkan banyak string,

e = 'a' + 'b' + 'c' + 'd'

dan memilikinya dalam dua baris seperti ini:

e = 'a' + 'b' +
    'c' + 'd'
sinar
sumber

Jawaban:

1212

Apa garis? Anda dapat memiliki argumen di baris berikutnya tanpa masalah:

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

Kalau tidak, Anda dapat melakukan sesuatu seperti ini:

if a == True and \
   b == False

Periksa panduan gaya untuk informasi lebih lanjut.

Dari baris contoh Anda:

a = '1' + '2' + '3' + \
    '4' + '5'

Atau:

a = ('1' + '2' + '3' +
    '4' + '5')

Perhatikan bahwa panduan gaya mengatakan bahwa menggunakan kelanjutan implisit dengan tanda kurung lebih disukai, tetapi dalam kasus khusus ini hanya menambahkan tanda kurung di sekitar ekspresi Anda mungkin cara yang salah untuk melangkah.

Harley Holcombe
sumber
35
Sebenarnya, Anda memiliki preferensi panduan gaya persis mundur. Kelanjutan implisit lebih disukai, backslash eksplisit harus digunakan hanya jika perlu.
Carl Meyer
35
Carl: Saya tidak setuju, ini dari panduan: Cara yang disukai untuk membungkus garis panjang adalah dengan menggunakan kelanjutan garis tersirat Python di dalam tanda kurung, kurung dan kawat gigi. Jika perlu, Anda bisa menambahkan sepasang tanda kurung tambahan di sekitar ekspresi, tetapi terkadang menggunakan garis miring terbalik terlihat lebih baik.
Jerub
15
Bagian penting dari kutipan panduan gaya adalah "Jika perlu, Anda dapat menambahkan sepasang tanda kurung tambahan di sekitar ekspresi, tetapi kadang-kadang menggunakan garis miring terbalik terlihat lebih baik." Panduan gaya tidak mengatakan bahwa Anda harus menambahkan tanda kurung, itu membiarkannya pada penilaian penulis.
Tony Meyer
23
Agaknya PEP-8 telah berubah sejak komentar ini ditambahkan, karena sudah cukup jelas sekarang bahwa tanda kurung harus ditambahkan untuk membungkus garis panjang: "Garis panjang dapat dipecah menjadi beberapa baris dengan membungkus ekspresi dalam tanda kurung."
Daniel
46
PEP8 memang berubah pada 2010 - "terkadang menggunakan backslash terlihat lebih baik" telah hilang.
e100
230

Dari PEP 8 - Panduan Gaya untuk Kode Python :

Cara pembungkus garis panjang yang disukai adalah dengan menggunakan kelanjutan garis tersirat Python di dalam tanda kurung, kurung dan kawat gigi. Garis panjang dapat dipecah menjadi beberapa baris dengan membungkus ekspresi dalam tanda kurung. Ini harus digunakan dalam preferensi untuk menggunakan garis miring terbalik untuk kelanjutan garis.

Garis miring terbalik mungkin masih tepat pada waktunya. Misalnya, panjang, banyak dengan-pernyataan tidak dapat menggunakan kelanjutan implisit, sehingga backslash dapat diterima:

with open('/path/to/some/file/you/want/to/read') as file_1, \
        open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

Lain halnya dengan pernyataan tegas.

Pastikan untuk membuat indentasi baris lanjutan dengan tepat. Tempat yang disukai untuk istirahat di sekitar operator biner adalah setelah operator, bukan sebelumnya. Beberapa contoh:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
                color == 'red' and emphasis == 'strong' or
                highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

PEP8 sekarang merekomendasikan konvensi yang berlawanan (untuk melanggar pada operasi biner) yang digunakan oleh matematikawan dan penerbit mereka untuk meningkatkan keterbacaan.

Gaya melanggar Donald Knuth sebelum operator biner menyelaraskan operator secara vertikal, sehingga mengurangi beban kerja mata saat menentukan item mana yang ditambahkan dan dikurangi.

Dari PEP8: Haruskah sambungan terputus sebelum atau setelah operator biner? :

Donald Knuth menjelaskan aturan tradisional dalam seri Computers and Typesetting-nya: "Meskipun formula dalam paragraf selalu berhenti setelah operasi biner dan relasi, rumus yang ditampilkan selalu rusak sebelum operasi biner" [3].

Mengikuti tradisi dari matematika biasanya menghasilkan kode yang lebih mudah dibaca:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Dalam kode Python, diizinkan untuk memecah sebelum atau setelah operator biner, selama konvensi konsisten secara lokal. Untuk kode baru, gaya Knuth disarankan.

[3]: The TeXBook karya Donald Knuth, halaman 195 dan 196

jfs
sumber
3
NB rekomendasi berubah pada 2010: "Garis panjang dapat dipatahkan ... dengan membungkus ekspresi dalam tanda kurung. Ini harus digunakan dalam preferensi untuk menggunakan backslash ...", dan semua backslash dihapus dari contoh kode.
e100
1
@ e100: baca teks dalam huruf tebal di atas: The preferred way .. is by using Python's implied line continuation inside parenthesesini sama dengan by wrapping expressions in parentheses. Saya telah memperbarui contoh
jfs
10
Tetapi perhatikan bahwa "terkadang menggunakan backslash terlihat lebih baik" juga sudah hilang.
e100
1
@ e100: inilah tiga contoh kode di mana garis miring terbalik membuat kode lebih mudah dibaca: "terkadang panduan gaya tidak berlaku. Jika ragu, gunakan penilaian terbaik Anda."
jfs
6
Pada 2015 panduan gaya telah diperbarui untuk benar-benar lebih suka melanggar sebelum operator biner setelah penelitian oleh Donald Knuth karena dianggap perbaikan dalam keterbacaan.
J2C
70

Bahaya menggunakan backslash untuk mengakhiri garis adalah bahwa jika spasi ditambahkan setelah backslash (yang, tentu saja, sangat sulit dilihat), backslash tidak lagi melakukan apa yang Anda pikir sebelumnya.

Lihat Python Idioms dan Anti-Idioms (untuk Python 2 atau Python 3 ) untuk lebih lanjut.

George V. Reilly
sumber
8
Ini adalah salah satu alasan mengapa senang melihat trailing spasi lebih baik; yaitu sesuatu seperti set list listchars=trail:·di vim. :)
Beau
25

Letakkan a \di akhir baris Anda atau lampirkan pernyataan di parens ( .. ). Dari IBM :

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

atau

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)
SCdF
sumber
24

Anda dapat memutus garis di antara tanda kurung dan kawat gigi. Selain itu, Anda dapat menambahkan karakter garis miring terbalik \ke garis untuk secara eksplisit memecahnya:

x = (tuples_first_value,
     second_value)
y = 1 + \
    2
Konrad Rudolph
sumber
20

Dari mulut kuda: Garis eksplisit bergabung

Dua atau lebih garis fisik dapat digabungkan ke dalam garis logis menggunakan karakter garis miring terbalik ( \), sebagai berikut: ketika garis fisik berakhir dengan garis miring terbalik yang bukan bagian dari string literal atau komentar, itu bergabung dengan yang berikut membentuk garis logis tunggal , menghapus garis miring terbalik dan karakter end-of-line berikut. Sebagai contoh:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

Baris yang diakhiri dengan garis miring terbalik tidak dapat membawa komentar. Garis miring terbalik tidak melanjutkan komentar. Garis miring terbalik tidak melanjutkan token kecuali untuk string literal (yaitu, token selain string literal tidak dapat dibagi melintasi garis fisik menggunakan backslash). Backslash ilegal di tempat lain di jalur di luar string literal.

Jason Navarrete
sumber
7
-1 karena contohnya adalah IMO tidak langsung. Kondisional majemuk benar-benar dapat memiliki tanda kurung yang dilampirkan, yang lebih praktis (untuk pengeditan atau penulisan ulang otomatis) dan idiomatik.
u0b34a0f6ae
4

Ini mungkin bukan cara Pythonic, tapi saya biasanya menggunakan daftar dengan fungsi join untuk menulis string panjang, seperti query SQL:

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])
Hardik Sondagar
sumber
2

Diambil dari The Hitchhiker's Guide to Python ( Line Continuation ):

Ketika satu baris kode logis lebih panjang dari batas yang diterima, Anda perlu membaginya menjadi beberapa garis fisik. Penerjemah Python akan bergabung dengan garis berurutan jika karakter terakhir dari garis tersebut adalah garis miring terbalik. Ini membantu dalam beberapa kasus, tetapi biasanya harus dihindari karena kerapuhannya: spasi putih yang ditambahkan ke akhir baris, setelah garis miring terbalik, akan memecahkan kode dan mungkin memiliki hasil yang tidak terduga.

Solusi yang lebih baik adalah dengan menggunakan tanda kurung di sekitar elemen Anda. Di sebelah kiri dengan tanda kurung tertutup pada akhir baris, juru bahasa Python akan bergabung dengan baris berikutnya sampai tanda kurung ditutup. Perilaku yang sama berlaku untuk kurung kurawal dan bujur sangkar.

Namun , lebih sering daripada tidak, harus memecah garis logis panjang adalah tanda bahwa Anda mencoba melakukan terlalu banyak hal pada saat yang sama, yang dapat menghambat keterbacaan.

Karena itu, berikut adalah contoh mempertimbangkan beberapa impor (ketika melebihi batas garis, didefinisikan pada PEP-8 ), juga diterapkan pada string secara umum:

from app import (
    app, abort, make_response, redirect, render_template, request, session
)
ivanleoncz
sumber
1

Jika Anda ingin memecah baris Anda karena string literal yang panjang, Anda dapat memecah string itu menjadi beberapa bagian:

long_string = "a very long string"
print("a very long string")

akan diganti oleh

long_string = (
  "a "
  "very "
  "long "
  "string"
)
print(
  "a "
  "very "
  "long "
  "string"
)

Output untuk kedua pernyataan cetak:

a very long string

Perhatikan tanda kurung dalam afiksasinya.

Perhatikan juga bahwa memecah string literal menjadi beberapa bagian memungkinkan untuk menggunakan awalan literal hanya pada bagian-bagian dari string:

s = (
  "2+2="
  f"{2+2}"
)
jlaurens
sumber
0

Gunakan operator kelanjutan garis yaitu "\"

Contoh:

# Ex.1

x = 1
s =  x + x**2/2 + x**3/3 \
       + x**4/4 + x**5/5 \
       + x**6/6 + x**7/7 \
       + x**8/8
print(s)
# 2.7178571428571425


----------


# Ex.2

text = ('Put several strings within parentheses ' \
        'to have them joined together.')
print(text)


----------


# Ex.3

x = 1
s =  x + x**2/2 \
       + x**3/3 \
       + x**4/4 \
       + x**6/6 \
       + x**8/8
print(s)
# 2.3749999999999996
seralouk
sumber