Perché Python non ha commenti multilinea?


252

OK, sono consapevole che le stringhe a tre virgolette possono servire da commenti su più righe. Per esempio,

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

e

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

Ma tecnicamente parlando si tratta di stringhe, giusto?

Ho cercato su Google e letto la guida allo stile di Python, ma non sono riuscito a trovare una risposta tecnica al motivo per cui non esiste un'implementazione formale di commenti multilinea, / * * /. Non ho problemi a usare le virgolette triple, ma sono un po 'curioso di sapere cosa abbia portato a questa decisione di progettazione.


8
Se riesci a farlo come una stringa, perché aggiungere altri modi?
Brody,

12
Volevo solo aggiungere, che fallisce se ciò che stai cercando di commentare ha anche commenti / stringhe multi-linea. E questo ovviamente, è per questo che ne abbiamo bisogno.
nycynik,

50
@ S. Lott Penso che sia una domanda utile. Per capire perché Python è buono, è importante comprendere le decisioni di progettazione che sono state prese (e le decisioni in corso che vengono ancora prese). La domanda non è polemica o combattiva; è curioso. Non c'è bisogno di essere così duro con la curiosità.
Mark E. Haase,

6
Se hai bisogno di un commento a più righe per il merluzzo, basta if False:il codice
AturSams

5
@Brody Perché le stringhe vengono elaborate. I commenti vengono ignorati. Ci sono problemi con l'utilizzo delle stringhe come commenti.
Guardati

Risposte:


266

Dubito che otterrai una risposta migliore di "Guido non ha sentito la necessità di commenti su più righe".

Guido ha twittato su questo:

Suggerimento Python: è possibile utilizzare stringhe su più righe come commenti su più righe. Se non utilizzati come docstring, non generano codice! :-)


28
Vedi il tweet di Guido su questo.
Petr Viktorin,

15
uno svantaggio della combinazione di più righe e commenti di blocco è che IDE non ha idea di ciò che si desidera, quindi non è possibile mostrare i commenti in uno stile diverso, se necessario.
Baiyan Huang,

21
Inoltre, rende impossibile commentare il codice con stringhe multilinea (e può portare a errori di rientro se non stai attento). Ew!
Mike Graham,

3
Ho lavorato in molti campi in cui se il tuo codice contiene un codice commentato, il tuo codice viene rifiutato e potresti persino trovarti invitato ad aggiornare il tuo CV. Rimuovere il codice non necessario, non è un problema se il codice è sotto il controllo della versione o utilizzare if False:prima del codice che deve essere disabilitato.
Steve Barnes,

4
@SteveBarnes concorda sul fatto che grandi blocchi di codice commentato in produzione sono cattivi. Ma non capisco perché if Falsesia meglio. Esegue esattamente la stessa cosa, pur essendo meno chiara (poiché non è così ovvio a prima vista che il blocco di codice è stato disabilitato).

59

I commenti su più righe sono facilmente fragili. Cosa succede se si dispone di quanto segue in un semplice programma di calcolatrice?

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

Prova a commentarlo con un commento su più righe:

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

Spiacenti, la stringa contiene il delimitatore del commento finale.


174
La cosa più bella di questa risposta è come viene gestita dall'evidenziatore della sintassi di SO.
Nietzche-jou,

73
Questo è uno dei tanti motivi per cui abbiamo personaggi di escape, non lo vedo come un buon motivo per NON avere supporto per i commenti su più righe.
Natalie Adams,

34
Non capisco la tua logica - forse il mio commento non era abbastanza chiaro. Se abbiamo usato \ come carattere di escape: print ("Scegli un'operazione: + - * \ /") "* /" non indica più un blocco di commenti finali in quanto letteralmente / verrà stampato. Vai avanti e prova questo in C ++. In effetti, l'evidenziatore della sintassi di SO mostrerà che è valido. Questa non è una materia complessa, esiste da anni in altre lingue. Ti chiedo di aggiornare il tuo post per includere l'uso di caratteri di escape per mostrare che PUOI utilizzare "* /" nel tuo codice.
Natalie Adams,

23
cosa succede se il tuo codice contiene '' '. oops il tuo codice contiene il delimitatore del commento finale
siamii,

21
I commenti su più righe non sono intrinsecamente fragili; è solo che la maggior parte delle implementazioni sono (comprese quelle di Python). Il modo ovvio di fare commenti su più righe in Python, a mio avviso, è lasciarmi solo iniziare un blocco di commenti #:e usare il rientro per mostrare quando il commento è finito. È pulito, coerente e gestisce perfettamente l'annidamento.
GatesDA,

34

Il testo tra virgolette NON deve essere considerato commenti su più righe; per convenzione, sono dotstrings . Dovrebbero descrivere cosa fa il tuo codice e come usarlo, ma non per cose come commentare blocchi di codice.

Secondo Guido, i commenti multilinea in Python sono solo commenti a riga singola contigui (ricerca di "commenti blocco").

Per commentare blocchi di codice, a volte uso il seguente modello:

if False:
    # A bunch of code

6
Sembra che Guido abbia cambiato idea da allora.
Petr Viktorin,

5
per quanto riguarda la soluzione "if false:", il fatto è che in Python come funziona con le schede, dovresti inserire tutti i codici sotto "if False:". E stacca il pezzo dopo. Quindi dovresti essere abbastanza intelligente con il tuo editor di testo.
barlop

3
se usi un editor decente, dovrebbe essere lo stesso tempo di * /
AturSams

@barlop yup - impara i tuoi editor! Questo è generalmente ottenibile in meno di un secondo in Vim conV}>>
Trittico

30

Questo probabilmente risale al concetto fondamentale secondo cui dovrebbe esserci un modo ovvio per svolgere un compito. Altri stili di commento aggiungono complicazioni inutili e potrebbero ridurre la leggibilità.


8
Questo è il problema, credo: usare una stringa come commento non è ovvio e viola il principio "un modo per fare un compito", poiché ci sono due modi per fare commenti: stringhe e #.
GatesDA,

1
Ma non è significativamente diverso da quello che hai nei linguaggi basati su C: / * vs //, quindi non vedo quanto sia significativamente peggio.
Ben Roberts,

//, considera PERCHÉ qualcuno vorrebbe un commento su più righe. Buoni motivi ... consentire # # precedente ". Supponiamo che qualcuno voglia fare un diagramma ASCII o inserire un codice javascript di riferimento da copiare e incollare in caso di problemi specifici. L'unico modo ovvio di svolgere un'attività, qui, non copre i casi limite di tale attività. Sono d'accordo, tuttavia, che ulteriori stili di commento sono MALE.
Nathan Basanese,

3
"Non devo digitare tanti di questi # doohickeys". Questo è esattamente il motivo per cui praticamente tutte le lingue hanno commenti in blocco (/ * .. * /). Che ci crediate o no, ma mi piace documentare cosa fa il mio codice: input, output, algoritmi usati, parametri ... Questo è un sacco di testo che viene anche modificato. La limitazione ai soli commenti a riga singola è semplicemente ridicola. Si noti che NON sostengo l'approccio per commentare il codice, sebbene ciò sia spesso utile quando si provano approcci alternativi, purché siano noti i possibili effetti collaterali noti.
Albert Godfrind,

3
L'altra cosa che mi risente di Python è che è essenzialmente un linguaggio progettato da un solo uomo. Qualunque cosa Guido dice è la verità ... Quindi abbiamo tutte quelle strane incompatibilità tra le versioni linguistiche. Perché ? Perché Guido l'ha detto ...
Albert Godfrind

12

Bene, le triple virgolette sono usate come commenti multilinea in docstrings. E # commenti sono usati come commenti incorporati e le persone si abituano.

La maggior parte dei linguaggi di script non ha commenti multilinea. Forse è questa la causa?

Vedi PEP 0008 , sezione Commenti

E vedi se il tuo editor Python offre alcune scorciatoie da tastiera per commentare i blocchi. Emacs lo supporta, così come Eclipse, presumibilmente la maggior parte degli IDE decenti.



5

Personalmente il mio stile di commento in Java è come

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

Quindi avere commenti a riga singola non è poi così male se il tuo stile è tipico dell'esempio precedente perché in confronto avresti

#
# My multi-line comment in Python
#

VB.NET è anche una lingua con commenti a riga singola, e personalmente lo trovo fastidioso poiché i commenti finiscono per sembrare meno commenti di like e più come una sorta di citazione

'
' This is a VB.NET example
'

I commenti a riga singola finiscono per avere un minor utilizzo dei caratteri rispetto ai commenti a più righe e hanno forse meno probabilità di essere sfuggiti da alcuni personaggi malvagi in un'istruzione regex forse? Tenderei ad essere d'accordo con Ned però.


5

Per commentare un blocco di codice nell'IDE Pycharm :

  • Codice | Commenta con Line Comment
  • Windows o Linux: Ctrl+/
  • Mac OS: Command+/

4
# This
# is
# a 
# multi-line
# comment

Usa il blocco dei commenti o cerca e sostituisci (s / ^ / # / g) nel tuo editor per raggiungere questo obiettivo.


3

Ho risolto questo scaricando una macro per il mio editor di testo (TextPad) che mi consente di evidenziare le linee e quindi inserisce # nella prima di ogni riga. Una macro simile rimuove i #. Alcuni potrebbero chiedersi perché sia ​​necessaria la multilinea ma è utile quando si tenta di "disattivare" un blocco di codice per scopi di debug.


1

Per chiunque sia alla ricerca di commenti su più righe in Python, l'utilizzo del formato a virgoletta tripla può avere conseguenze problematiche, come ho appena appreso nel modo più duro. Considera questo:

this_dict = {
    'name': 'Bob',

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

    'species': 'Cat'
}

Il commento su più righe verrà inserito nella stringa successiva, incasinando la 'species'chiave. Meglio usare solo #per i commenti.


0

Perché la convenzione # è comune e in realtà non c'è niente che puoi fare con un commento multilinea che non puoi fare con un commento # -sign. È un incidente storico, come l'antenato dei /* ... */commenti che risalgono a PL / I,


0

Supponiamo che siano stati appena considerati non necessari. Dal momento che è così semplice digitare #a comment, i commenti su più righe possono consistere in molti commenti a riga singola.

Per HTML , d'altra parte, c'è più bisogno di multiliner. È più difficile continuare a digitare <!--comments like this-->.


4
non è questo il punto: ci sono casi d'uso ovvi sia per i commenti a linea singola che per quelli a più righe. Li ho usati ampiamente in altre lingue (anche se so che i puristi di Python non si interessano di altre lingue). ;)
johndodo,

1
prova a farlo con 200 righe di codice, che devi estrarre, reinserire, quindi estrarre di nuovo. Digitando 200 # iniziali si invecchia molto velocemente.
DragonLord,

0

Questa è solo un'ipotesi .. ma

Poiché sono stringhe, hanno un valore semantico (il compilatore non si sbarazza di esse), quindi ha senso che vengano utilizzate come stringhe. In realtà diventano parte dell'AST , quindi l'estrazione della documentazione diventa più semplice.


0

Inoltre, i commenti multilinea sono una stronza . Mi dispiace dirlo, ma indipendentemente dalla lingua, non li uso per scopi diversi dal debug. Supponi di avere un codice come questo:

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

Quindi scopri che nel tuo codice c'è qualcosa che non puoi correggere con il debugger, quindi inizi a eseguire il debug manualmente commentando blocchi di codice sempre più piccoli con questi commenti multilinea. Ciò darebbe quindi la funzione:

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

Questo è davvero irritante.


3
fantastico, ma Python non ha /*commenti in stile.
Trittico,

17
Bene, dato che Python non ha veri commenti multilinea, è stato un po 'difficile dare esempi in Python.
martiert,

2
Personalmente non capisco il problema. Basta eliminare il extra * /. Oppure usa // per commentare le singole righe se devi essere preciso.
Natalie Adams,

4
Esistono diverse lingue (molte delle quali funzionali per qualsiasi motivo) che consentono commenti nidificati. Cerca "nidificato" in rosettacode.org/wiki/Commenti per esempi.
Keith,

1
beh sì, sarebbe irritante inserire un commento su più righe in un commento su più righe. E mentre ricordo solo un po 'del mio programma alla volta, ricordo almeno quale parte del mio programma sto guardando e quindi quale ho commentato. Ma se non riesci nemmeno a ricordarlo, allora puoi usare il fatto che alcuni IDE rendono corsivo ciò che è un commento. Ad ogni modo, ovviamente, per una funzione così piccola, puoi anche usare commenti a riga singola. Ma se stai commentando un grosso pezzo di programma, hai davvero bisogno di un commento multilinea. o un editor di testo con quella funzione.
barlop

0

Commenti multilinea usando IDLE su:

  • Mac OS X , dopo la selezione del codice, commenta un blocco di codice con Ctrl+ 3e decommenta usando Ctrl+ 4.

  • Windows , dopo la selezione del codice, commenta un blocco di codice con Ctrl+ Alt+ 3e decommenta usando Ctrl+ At+ 4.


-1

Ricordo di aver letto di un ragazzo che avrebbe inserito i suoi commenti su più righe in una variabile a tre virgolette:

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

Questo richiede un po 'di memoria, ma ti offre funzionalità di commento multilinea e inoltre la maggior parte degli editor metterà in evidenza la sintassi per te :)

È anche facile commentare il codice semplicemente avvolgendolo con

x = '''

e

'''

18
rimuovere il x =e non occupa alcuna memoria.
endolith
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.