Mengapa Python tidak memiliki komentar multiline?

252

OK, saya sadar bahwa string triple-quotes dapat berfungsi sebagai komentar multiline. Sebagai contoh,

"""Hello, I am a 
   multiline comment"""

dan

'''Hello, I am a 
   multiline comment'''

Tapi secara teknis ini adalah string, benar?

Saya sudah googled dan membaca panduan gaya Python, tetapi saya tidak dapat menemukan jawaban teknis mengapa tidak ada implementasi formal multiline, / * * / jenis komentar. Saya tidak punya masalah menggunakan tanda kutip tiga, tapi saya sedikit ingin tahu apa yang menyebabkan keputusan desain ini.

CoolGravatar
sumber
8
Jika Anda dapat melakukannya sebagai string mengapa menambahkan lebih banyak cara?
Brody
12
Hanya ingin menambahkan, bahwa gagal jika apa yang Anda coba komentar kebetulan juga memiliki komentar / string multi-line. Dan tentu saja itu sebabnya kami membutuhkannya.
nycynik
50
@ S.Lott Saya pikir ini pertanyaan yang berguna. Untuk memahami mengapa Python baik, penting untuk memahami keputusan desain yang dibuat (dan keputusan yang sedang berjalan yang masih dibuat). Pertanyaannya tidak argumentatif atau agresif; ini penasaran. Tidak perlu terlalu keras tentang keingintahuan.
Mark E. Haase
6
Jika Anda membutuhkan komentar multi-baris untuk cod hanya if False:kode
AturSams
5
@Brody Karena string diproses. Komentar diabaikan. Ada masalah dengan menggunakan string sebagai komentar. Lihat-lihat saja :)
ADTC

Jawaban:

266

Saya ragu Anda akan mendapatkan jawaban yang lebih baik daripada, "Guido tidak merasa perlu komentar multi-baris".

Guido telah tweet tentang ini:

Tip Python: Anda dapat menggunakan string multi-line sebagai komentar multi-line. Kecuali digunakan sebagai dokumen, mereka tidak menghasilkan kode! :-)

Ned Batchelder
sumber
28
Lihat tweet Guido tentang ini.
Petr Viktorin
15
satu kelemahan dari campuran multi-line string dan blok komentar adalah IDE tidak tahu apa yang Anda inginkan sehingga tidak dapat menampilkan komentar dengan gaya yang berbeda sesuai kebutuhan.
Baiyan Huang
21
Itu juga membuatnya tidak mungkin untuk berkomentar kode dengan string multi-line (dan dapat menyebabkan kesalahan lekukan jika Anda tidak hati-hati). Ew!
Mike Graham
3
Saya telah bekerja di banyak bidang di mana jika kode Anda berisi kode komentar maka kode Anda ditolak dan Anda bahkan mungkin menemukan diri Anda diundang untuk memperbarui CV Anda. Hapus kode yang tidak diperlukan, tidak masalah jika kode di bawah kontrol versi, atau gunakan if False:sebelum kode yang perlu dinonaktifkan.
Steve Barnes
4
@SteveBarnes setuju bahwa blok besar kode komentar dalam produksi buruk. Tapi saya tidak mengerti mengapa if Falselebih baik. Itu mencapai hal yang persis sama, sementara menjadi kurang jelas (karena tidak sekilas sekilas bahwa blok kode telah dinonaktifkan).
59

Komentar multi-baris mudah dipecahkan. Bagaimana jika Anda memiliki yang berikut dalam program kalkulator sederhana?

operation = ''
print("Pick an operation:  +-*/")
# Get user input here

Cobalah untuk berkomentar dengan komentar multi-baris:

/*
operation = ''
print("Pick an operation:  +-*/")
# Get user input here
*/

Ups, string Anda berisi pembatas komentar akhir.

Steve Losh
sumber
174
Hal terbaik tentang jawaban ini adalah bagaimana ia ditangani oleh highlighter sintaksis SO.
Nietzche-jou
73
Ini adalah salah satu dari banyak alasan mengapa kita memiliki karakter pelarian, saya tidak melihat itu sebagai alasan yang baik untuk TIDAK memiliki dukungan untuk komentar multi-baris.
Natalie Adams
34
Saya tidak mengerti logika Anda - mungkin komentar saya tidak cukup jelas. Jika kita menggunakan \ sebagai karakter pelolosan: cetak ("Pilih operasi: + - * \ /") "* /" tidak lagi menunjukkan blok komentar akhir secara harfiah / akan dicetak. Silakan dan uji ini dalam C ++. Pada kenyataannya, stabilo sintaksis SO akan menunjukkan yang valid. Ini bukan subjek yang kompleks, sudah ada selama bertahun-tahun dalam bahasa lain. Saya akan meminta Anda memperbarui posting Anda untuk memasukkan penggunaan karakter melarikan diri untuk menunjukkan bahwa Anda BISA menggunakan "* /" dalam kode Anda.
Natalie Adams
23
bagaimana jika kode Anda mengandung '' '. oops kode Anda mengandung pembatas komentar akhir
siamii
21
Komentar multi-baris tidak dapat dipisahkan secara inheren; hanya saja sebagian besar implementasinya (termasuk Python). Cara yang jelas untuk melakukan komentar multi-baris dengan Python, menurut saya, adalah dengan membiarkan saya memulai blok komentar dengan #:dan menggunakan indentasi untuk menunjukkan kapan komentar itu berakhir. Ini bersih, konsisten, dan menangani sarang dengan sempurna.
GatesDA
34

Teks yang dikutip tiga kali lipat TIDAK boleh dianggap sebagai komentar multisaluran; dengan konvensi, mereka adalah dokumen . Mereka harus menjelaskan apa yang kode Anda lakukan dan bagaimana menggunakannya, tetapi tidak untuk hal-hal seperti mengomentari blok kode.

Menurut Guido, komentar multiline dengan Python hanyalah komentar baris tunggal yang bersebelahan (cari "blokir komentar").

Untuk mengomentari blok kode, saya terkadang menggunakan pola berikut:

if False:
    # A bunch of code
Triptych
sumber
6
Sepertinya Guido menenangkan pikirannya sejak saat itu.
Petr Viktorin
5
berkenaan dengan solusi "if false:", masalahnya adalah bahwa dengan python ketika ia bekerja dengan tab, Anda harus tab di semua kode di bawah "if False:". Dan untab potongan setelahnya. Jadi, Anda harus cukup pintar dengan editor teks Anda.
barlop
3
jika Anda menggunakan editor yang layak, itu harus sama dengan waktu * /
AturSams
@barlop yup - pelajari editor Anda! Ini biasanya dapat dicapai dalam waktu kurang dari satu detik dalam vim denganV}>>
Triptych
30

Ini kemungkinan kembali ke konsep inti bahwa harus ada satu cara yang jelas untuk melakukan tugas. Gaya komentar tambahan menambah komplikasi yang tidak perlu dan dapat mengurangi keterbacaan.

Jarred McCaffrey
sumber
8
Itulah masalahnya, saya percaya: Menggunakan string sebagai komentar tidak jelas dan melanggar prinsip "satu cara untuk melakukan tugas", karena ada dua cara untuk melakukan komentar: string dan #.
GatesDA
1
Tapi ini tidak jauh berbeda dari apa yang Anda miliki dalam bahasa berbasis C: / * vs //, jadi saya tidak melihat bagaimana secara signifikan lebih buruk.
Ben Roberts
//, Pertimbangkan MENGAPA seseorang ingin komentar multi-baris. Alasan yang bagus: ... Saya tidak bisa memikirkan "Saya tidak perlu mengetik banyak # doohickeys ini" dan "Saya perlu menampilkan komentar khusus ini dengan cara yang sangat tepat, dan cara yang tepat tidak tidak diizinkan untuk # sebelumnya. " Katakanlah seseorang ingin melakukan diagram ASCII, atau menaruh beberapa kode javascript referensi untuk disalin dan ditempelkan jika masalah tertentu muncul. Satu-satunya cara yang jelas untuk melakukan tugas, di sini, tidak mencakup kasus-kasus tepi dari tugas itu. Saya setuju, bahwa gaya komentar tambahan buruk.
Nathan Basanese
3
"Saya tidak harus mengetikkan # doohickeys sebanyak ini". Itulah sebabnya mengapa hampir semua bahasa memiliki komentar blokir (/ * .. * /). Percaya atau tidak, tapi saya suka mendokumentasikan apa yang kode saya lakukan: input, output, algoritma yang digunakan, parameter ... Itu banyak teks yang juga akan dimodifikasi. Pembatasan hanya komentar single-line hanya konyol. Perhatikan bahwa saya TIDAK menganjurkan pendekatan untuk berkomentar kode - meskipun itu sering berguna ketika mencoba pendekatan alternatif, selama efek samping yang diketahui mungkin dipahami.
Albert Godfrind
3
Hal lain yang saya benci tentang python adalah bahwa itu pada dasarnya adalah bahasa yang dirancang satu orang. Apa pun yang dikatakan Guido adalah kebenaran ... Jadi kami memiliki semua ketidakcocokan yang aneh antara versi bahasa. Mengapa Karena Guido bilang begitu ...
Albert Godfrind
12

Nah, triple-quotes digunakan sebagai komentar multiline dalam dokumen. Dan # komentar digunakan sebagai komentar sebaris dan orang-orang terbiasa dengannya.

Sebagian besar bahasa skrip juga tidak memiliki komentar multiline. Mungkin itu penyebabnya?

Lihat PEP 0008 , Komentar bagian

Dan lihat apakah editor Python Anda menawarkan beberapa cara pintas keyboard untuk memblokir komentar. Emacs mendukungnya, juga Eclipse, mungkin sebagian besar dari IDE yang layak melakukannya.

Abgan
sumber
9

Dari The Zen of Python :

Harus ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya.

Jeremy Cantrell
sumber
5

Secara pribadi gaya komentar saya di katakan seperti Java

/*
 * My multi-line comment in Java
 */

Jadi memiliki komentar single-line saja bukan hal yang buruk jika gaya Anda khas untuk contoh sebelumnya karena sebagai perbandingan Anda akan memiliki

#
# My multi-line comment in Python
#

VB.NET juga merupakan bahasa dengan komentar hanya satu baris, dan secara pribadi saya merasa menjengkelkan karena komentar pada akhirnya tampak kurang menyukai komentar dan lebih seperti semacam kutipan

'
' This is a VB.NET example
'

Komentar single-line-only akhirnya memiliki lebih sedikit penggunaan karakter daripada komentar multi-line, dan lebih kecil kemungkinannya untuk diloloskan oleh beberapa karakter yang cerdik dalam pernyataan regex mungkin? Tapi aku cenderung setuju dengan Ned.

Kezzer
sumber
5

Untuk mengomentari blok kode di Pycharm IDE:

  • Kode | Komentar dengan Komentar Baris
  • Windows atau Linux: Ctrl+/
  • OS Mac: Command+/
Craig S. Anderson
sumber
4
# This
# is
# a 
# multi-line
# comment

Gunakan blok komentar atau cari dan ganti (s / ^ / # / g) di editor Anda untuk mencapai ini.

rekursif
sumber
3

Saya menyelesaikan ini dengan mengunduh makro untuk editor teks saya (TextPad) yang memungkinkan saya menyorot baris dan kemudian memasukkan # di bagian pertama dari setiap baris. Makro serupa menghapus # itu. Beberapa orang mungkin bertanya mengapa multiline diperlukan tetapi itu berguna ketika Anda mencoba untuk "mematikan" blok kode untuk keperluan debugging.

kati
sumber
1

Untuk orang lain yang mencari komentar multi-baris dalam Python - menggunakan format triple quote dapat memiliki beberapa konsekuensi yang bermasalah, karena saya baru saja belajar dengan cara yang sulit. Pertimbangkan ini:

this_dict = {
    'name': 'Bob',

"""
This is a multiline comment in the middle of a dictionary
"""

    'species': 'Cat'
}

Komentar multi-baris akan dimasukkan ke string berikutnya, mengacaukan 'species'kunci. Lebih baik gunakan saja #untuk komentar.

Itamar Mushkin
sumber
0

Karena konvensi # adalah yang umum, dan benar-benar tidak ada yang dapat Anda lakukan dengan komentar multiline yang tidak dapat Anda lakukan dengan komentar # -sign. Ini kecelakaan historis, seperti nenek moyang dari /* ... */komentar yang kembali ke PL / I,

Charlie Martin
sumber
0

Anggap saja mereka dianggap tidak perlu. Karena sangat mudah untuk mengetik saja #a comment, komentar multiline dapat terdiri dari banyak komentar satu baris.

Untuk HTML , di sisi lain, ada lebih banyak kebutuhan untuk multiliners. Lebih sulit untuk terus mengetik <!--comments like this-->.

stalepretzel
sumber
4
ini bukan intinya - ada kasus penggunaan yang jelas untuk komentar baris tunggal dan multi baris. Saya telah menggunakan keduanya secara luas dalam bahasa lain (meskipun saya tahu puritan python tidak peduli dengan bahasa lain). ;)
johndodo
1
coba lakukan ini dengan 200 baris kode, yang harus Anda ambil, masukkan kembali, lalu ambil lagi. Mengetik 200 inisial # menjadi cepat sangat cepat.
DragonLord
0

Ini hanya dugaan .. tapi

Karena mereka adalah string, mereka memiliki beberapa nilai semantik (kompiler tidak menghilangkannya), oleh karena itu masuk akal bagi mereka untuk digunakan sebagai dokumen. Mereka sebenarnya menjadi bagian dari AST , jadi mengekstraksi dokumentasi menjadi lebih mudah.

Hasen
sumber
0

Selain itu, komentar multiline adalah menyebalkan . Maaf untuk mengatakan, tetapi terlepas dari bahasa, saya tidak menggunakannya untuk hal lain selain tujuan debugging. Katakanlah Anda memiliki kode seperti ini:

void someFunction()
{
    Something
    /*Some comments*/
    Something else
}

Kemudian Anda mengetahui bahwa ada sesuatu dalam kode Anda yang tidak dapat Anda perbaiki dengan debugger, jadi Anda mulai secara manual mendebugnya dengan mengomentari potongan kode yang lebih kecil dan lebih kecil dengan komentar multiline ini. Ini kemudian akan memberikan fungsi:

void someFunction()
{ /*
    Something
   /* Comments */
   Something more*/
}

Ini sangat menjengkelkan.

martiert
sumber
3
uh hebat, tapi Python tidak punya /*komentar gaya.
Triptych
17
Benar, karena python tidak memiliki komentar multiline nyata itu agak sulit memberi contoh dalam python.
martiert
2
Saya pribadi tidak mengerti masalahnya. Hapus saja tambahan * /. Atau gunakan // untuk mengomentari satu baris jika Anda harus tepat.
Natalie Adams
4
Ada beberapa bahasa (banyak dari mereka fungsional untuk alasan apa pun) yang memungkinkan komentar bersarang. Cari "nested" di rosettacode.org/wiki/Comments untuk contoh.
Keith
1
baik ya itu akan menjengkelkan untuk menempatkan komentar multi-line dalam komentar multi-line. Dan sementara saya hanya mengingat sedikit program saya pada suatu waktu, saya setidaknya ingat bagian mana dari program saya yang saya lihat dan yang saya komentari. Tetapi jika Anda bahkan tidak dapat mengingatnya, maka Anda dapat menggunakan fakta bahwa beberapa IDE membuat huruf miring sebagai komentar. Bagaimanapun jelas untuk fungsi sekecil itu, Anda dapat menggunakan komentar satu baris. Tetapi jika mengomentari sebagian besar program, Anda benar-benar membutuhkan komentar multi-baris. atau editor teks dengan fitur itu.
barlop
0

Komentar multiline menggunakan IDLE di:

  • Mac OS X , setelah pemilihan kode, beri komentar satu blok kode dengan Ctrl+ 3dan batalkan komentar menggunakan Ctrl+ 4.

  • Windows , setelah pemilihan kode, beri komentar satu blok kode dengan Ctrl+ Alt+ 3dan batalkan komentar menggunakan Ctrl+ At+ 4.

Jorgesys
sumber
-1

Saya ingat pernah membaca tentang seorang pria yang akan memberikan komentar multi-barisnya ke dalam variabel yang dikutip tiga kali lipat:

x = '''
This is my
super-long mega-comment.
Wow there are a lot of lines
going on here!
'''

Ini memang memakan sedikit memori, tetapi memberi Anda fungsi komentar multi-line, dan ditambah kebanyakan editor akan menyoroti sintaks untuk Anda :)

Juga mudah untuk berkomentar kode hanya dengan membungkusnya dengan

x = '''

dan

'''
turvyc
sumber
18
menghapus x =dan tidak memakan memori apa pun.
endolith