Apakah titik dua dalam blok python secara teknis perlu?

19

Ini benar-benar hanya pertanyaan teoretis oleh pemula python yang ingin lebih memahami.

Saya selalu lupa titik dua setelah blok pernyataan awal dengan python. Itulah yang saya maksud:

  • for <variable> in <sequence>:
  • if <blah blah>:

Pikiran saya adalah bahwa salah satu alasan saya terus lupa adalah, bahwa mereka secara implisit bersifat de-fakto: kolon atau tidak, pernyataan itu diakhiri dengan kalimat itu.

Pertanyaan saya - yang saya tanyakan untuk mempelajari bagaimana sintaksis python bekerja - adalah, apakah usus besar benar-benar tidak perlu? Apakah saya harus mengubah sintaksis python sehingga usus besar tidak lagi diperlukan, akankah ada yang pecah? Apakah itu membuat beberapa pernyataan ambigu atau tidak mungkin?

Tomáš Zato - Pasang kembali Monica
sumber
4
Saya pikir Anda tidak mengerti pertanyaannya, yaitu apakah titik dua diperlukan untuk sintaks untuk bekerja. Selain itu, apa pun jawaban Anda, jawaban itu juga harus berisi penjelasan.
Tomáš Zato - Reinstate Monica
Mungkin, dapatkah Anda mengulangi bagian-bagian dari pertanyaan, sehingga saya dapat mengambil manfaat dari wawasan Anda tentang masalah ini, mungkin sebuah contoh? Anda akan menjadi hakim terbaik, saya pikir saya tidak mengerti tentang niat Anda untuk bertanya. Apakah Anda bermaksud pada tingkat parser interpreter / compiler? Terima kasih banyak.
bhan sur
Saya tidak tahu bagaimana mengucapkannya dengan lebih baik. Pertanyaan saya pada dasarnya adalah, jika Anda bisa mengubah semua sintaks python sehingga tidak lagi membutuhkan usus setelah if, else, whiledan sebagainya. Jika Anda melakukan itu, apakah python masih menjadi bahasa yang dapat digunakan tanpa ambiguitas?
Tomáš Zato - Reinstate Monica
Mengerti! Ini pertanyaan seputar keputusan desain sintaksis python . Maaf, salah paham. Terima kasih telah menjelaskan.
bhan sur
Berspekulasi. Seolah-olah garis putus lebih sulit untuk dideteksi oleh penerjemah / pengurai dalam praktek atau ada untuk dibaca. Dalam LUA Anda dapat menulis if .. then .. enddalam satu baris. Jadi di sini di python thendiganti dengan dua hal :dan baris baru yang diperlukan. Salah satunya tampak berlebihan.
bhan sur

Jawaban:

9

Ya, titik dua diperlukan untuk mendisambiguasikan konstruksi tertentu. Pertimbangkan, misalnya if x - y < z: pass,. Tanpa titik dua kita tidak bisa memutuskan bagaimana mengurai ini tanpa mengetahui konteks apa x, y, dan z. if x: -y < z...valid jika x adalah boolean, if x - y < z:valid sebaliknya.

Karena itu adalah ide yang sangat bagus untuk bahasa pemrograman untuk tidak mengharuskan Anda untuk menjalankan aplikasi sampai titik yang Anda kompilasi untuk dapat menguraikannya, titik dua sangat diperlukan. Anda bisa menjatuhkannya, tetapi Anda perlu cara lain untuk membuat ambigu.

Phoshi
sumber
1
Tunggu, Anda dapat memiliki pernyataan setelah titik dua pada baris yang sama? Saya cukup yakin itu tidak diizinkan.
Tomáš Zato - Reinstate Monica
1
Itu diizinkan, tetapi hanya dengan linebreak setelahnya.
Phoshi
Masih sedikit bingung. Apakah ini diizinkan: if condition: print("Condition passed")\ndiizinkan? The \nmelambangkan baris baru setelah pernyataan cetak.
Tomáš Zato - Pasang kembali Monica
Tentu, coba saja.
RemcoGerlich
1
@TomasZato: ya, Anda dapat memiliki pernyataan apa pun setelah titik dua. Itu segera mengakhiri blok, jadi itu terutama berguna ketika blok adalah satu liner kecil.
Lie Ryan
14

Kolon tidak benar-benar diperlukan secara tata bahasa, seandainya Python dirancang di dunia yang berbeda, cukup mungkin bahwa perancang bahasa mungkin tidak memutuskan untuk meminta usus besar. Dan memang bahasa seperti Cobra melakukan ini.

Alasan utama mengapa usus besar diperlukan dalam python adalah keterbacaan manusia. Mengutip dari Python FAQ :

Mengapa titik dua diperlukan untuk pernyataan if / while / def / class?

Usus besar diperlukan terutama untuk meningkatkan keterbacaan (salah satu hasil dari bahasa ABC eksperimental). Pertimbangkan ini:

if a == b
    print(a)

melawan

if a == b:
    print(a)

Perhatikan bagaimana yang kedua sedikit lebih mudah dibaca. Perhatikan lebih lanjut bagaimana titik dua memberikan contoh dalam jawaban FAQ ini; ini adalah penggunaan standar dalam bahasa Inggris.

Alasan kecil lainnya adalah bahwa titik dua memudahkan editor dengan penyorotan sintaksis; mereka dapat mencari titik dua untuk memutuskan kapan lekukan perlu ditingkatkan daripada harus melakukan penguraian teks program yang lebih rumit.

Seperti yang juga disebutkan dalam FAQ, titik dua juga memudahkan untuk memproses kode python tanpa sepenuhnya menguraikan bahasa. Prosesor teks apa pun yang memiliki parser lengkap penuh, termasuk python compiler, dapat melakukannya tanpa titik dua jika itu tidak diperlukan atau jika itu dibuat opsional ketika tidak ambigu.

Lie Ryan
sumber
3
"Perhatikan bagaimana yang kedua sedikit lebih mudah dibaca." Saya menemukan yang pertama lebih mudah dibaca. Lebih sedikit noise.
user76284
10

Itu tidak perlu untuk komputer, tetapi untuk manusia.

Guido van Rossum (pencipta Python) memiliki blog sejarah Python untuk sementara waktu. Usus besar diperkenalkan di ABC , sumber dari banyak fitur Python.

Dalam posting blog ini di "Karin Dewar, Indentation and the Colon" , Guido menulis:

Dan di sini saya akan memparafrasekan, atas permintaan Lambert.

Pada tahun 1978, dalam sebuah sesi desain di sebuah rumah besar di Jabłonna (Polandia), Robert Dewar, Peter King, Jack Schwartz dan Lambert membandingkan berbagai sintaks alternatif yang diusulkan untuk B, dengan membandingkan implementasi jenis gelembung (kereta) yang dituliskan pada setiap alternatif. Karena mereka tidak setuju, istri Robert Dewar dipanggil dari kamarnya dan meminta pendapatnya, seperti Paris zaman modern yang diminta untuk membandingkan keindahan Hera, Athena, dan Aphrodite. Tetapi setelah versi pertama dijelaskan kepadanya, dia berkomentar: "Maksud Anda, di baris di mana dikatakan: 'UNTUK saya ...', bahwa itu harus dilakukan untuk baris yang mengikuti; bukan hanya untuk baris itu? ! " Dan di sini para ilmuwan menyadari bahwa kesalahpahaman akan dihindari jika ada titik dua di ujung garis itu.

( B di sini adalah serangkaian bahasa prototipe B0, B1, ... yang mengarah ke ABC. Ini bukan bahasa B yang merupakan pendahulu dari C).

Saya juga ingat Guido menunjukkan di tahun 90-an bahwa itu untuk kepentingan editor , yang secara otomatis dapat memasukkan indent setelah garis yang berakhir dengan titik dua. Tetapi saya belum menemukan sumber untuk itu.

RemcoGerlich
sumber
4

The Cobra Bahasa Pemrograman 's sintaks ini sangat terinspirasi oleh Python, dan itu tidak jauh dengan usus besar, sehingga tampaknya itu tidak benar-benar diperlukan. Namun, itu tidak cukup untuk hanya menghilangkan titik dua, ada perubahan lain pada sintaks yang diperlukan. Lihat, misalnya potongan kode ini dari salah satu proyek mainan saya :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Tanpa titik dua untuk memisahkan tubuh dari daftar parameter, saya harus menggunakan indentasi:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Saya percaya versi Cobra sebelumnya yang menjadikan usus besar opsional, Anda bisa menggunakan lekukan atau titik dua atau keduanya. Mirip dengan cara kerjanya di Ruby, di mana ada kata kunci untuk memisahkan berbagai bagian dari ekspresi kontrol, tetapi Anda juga dapat menggunakan pemisah ekspresi (titik koma atau baris baru):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

Di versi Cobra saat ini, Anda dapat menggunakan koma:

if x
    y

dapat ditulis sebagai

if x, y

Anda memerlukan beberapa cara untuk memisahkan berbagai bagian dari ekspresi atau definisi kontrol. Dalam Python, itu adalah titik dua. Jika Anda menghapus titik dua, Anda perlu menggantinya dengan sesuatu yang lain, misalnya indentasi paksa . Hanya dengan menghilangkan titik dua tidak akan bekerja.

Satu-satunya cara untuk benar-benar yakin adalah memformalkan sintaksis dengan dan tanpa titik dua dan membuktikan ketidak-ambiguannya.

Namun, perhatikan bahwa salah satu aforisme Zen Python adalah "Eksplisit lebih baik daripada Implisit", sehingga penggambaran eksplisit blok dengan titik dua tampaknya cocok dengan filosofi umum Python. The Desain dan Sejarah FAQ juga menyebutkan bahwa keputusan ini didasarkan pada bukti empiris dari pendahulunya Python, ABC.

Jörg W Mittag
sumber
3
Nah, dengan filosofi yang dijelaskan dalam paragraf terakhir, Anda bisa memerlukan titik dua di akhir setiap baris. Eksplisit vs implisit hanya masuk akal jika eksplisit benar-benar menambahkan informasi (mis. Varian implisit ambigu). Yang mana pertanyaan saya.
Tomáš Zato - Reinstate Monica