Dlaczego Python nie ma komentarzy wielowierszowych?

252

OK, wiem, że ciągi potrójnych cudzysłowów mogą służyć jako komentarze wielowierszowe. Na przykład,

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

i

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

Ale technicznie rzecz biorąc są to ciągi, prawda?

Poszukałem go i przeczytałem przewodnik po stylu Python, ale nie byłem w stanie znaleźć technicznej odpowiedzi na pytanie, dlaczego nie ma formalnej implementacji multilinii, / * * / komentarzy. Nie mam problemu z użyciem potrójnych cytatów, ale jestem trochę ciekawy, co doprowadziło do tej decyzji projektowej.

CoolGravatar
źródło
8
Jeśli możesz to zrobić jako ciąg, po co dodawać więcej sposobów?
Brody,
12
Chciałem tylko dodać, że to się nie powiedzie, jeśli to, co próbujesz skomentować, zawiera również komentarze / ciągi wielowierszowe. I właśnie dlatego ich potrzebujemy.
nycynik
50
@ S.Lott Myślę, że to przydatne pytanie. Aby zrozumieć, dlaczego Python jest dobry, ważne jest, aby zrozumieć decyzje projektowe, które zostały podjęte (i decyzje bieżące, które wciąż są podejmowane). Pytanie nie jest dyskusyjne ani walczące; to ciekawe. Ciekawość nie musi być tak surowa.
Mark E. Haase
6
Jeśli potrzebujesz wieloliniowego komentarza do dorsza, wystarczy if False:kod
AturSams,
5
@Brody Ponieważ ciągi są przetwarzane. Komentarze są ignorowane. Występują problemy z używaniem ciągów jako komentarzy. Tylko się rozejrzyj :)
ADTC

Odpowiedzi:

266

Wątpię, aby uzyskać lepszą odpowiedź niż: „Guido nie odczuwał potrzeby komentowania wielu wierszy”.

Guido napisał o tym na Twitterze :

Wskazówka w języku Python: Możesz używać ciągów wieloliniowych jako komentarzy wieloliniowych. O ile nie są używane jako dokumenty, nie generują kodu! :-)

Ned Batchelder
źródło
28
Zobacz tweet Guido na ten temat.
Petr Viktorin
15
jedną wadą mieszania wieloliniowych ciągów znaków i blokowych komentarzy jest to, że IDE nie ma pojęcia, czego chcesz, dlatego nie może wyświetlać komentarzy w innym stylu, zależnie od potrzeb.
Baiyan Huang,
21
Uniemożliwia także komentowanie kodu ciągami zawierającymi wiele wierszy (i może prowadzić do błędów wcięcia, jeśli nie będziesz ostrożny). Ew!
Mike Graham,
3
Pracowałem w wielu dziedzinach, w których jeśli twój kod zawiera kod skomentowany, to Twój kod jest odrzucany i możesz nawet zostać poproszony o aktualizację swojego CV. Usuń niepotrzebny kod, nie stanowi problemu, jeśli kod jest pod kontrolą wersji, lub użyj if False:przed kodem, który należy wyłączyć.
Steve Barnes,
4
@ SteveBarnes zgadza się, że duże bloki skomentowanego kodu w produkcji są złe. Ale nie rozumiem, dlaczego if Falsejest lepiej. Osiąga dokładnie to samo, a jednocześnie jest mniej wyraźny (ponieważ na pierwszy rzut oka nie jest tak oczywiste, że blok kodu został wyłączony).
59

Komentarze wieloliniowe można łatwo łamać. Co jeśli masz następujące elementy w prostym programie kalkulatora?

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

Spróbuj to skomentować za pomocą komentarza wieloliniowego:

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

Ups, Twój ciąg zawiera ogranicznik komentarza końcowego.

Steve Losh
źródło
174
Najładniejszą rzeczą w tej odpowiedzi jest sposób, w jaki jest obsługiwany przez wyróżniacz składni SO.
Nietzche-jou
73
Jest to jeden z wielu powodów, dla których mamy znaki specjalne, nie uważam tego za dobry powód, aby NIE obsługiwać komentarzy wieloliniowych.
Natalie Adams,
34
Nie rozumiem twojej logiki - być może mój komentarz nie był wystarczająco jasny. Jeśli użyliśmy \ jako znaku zmiany znaczenia: print („Wybierz operację: + - * \ /”) „* /” nie oznacza już bloku komentarza końcowego, ponieważ dosłownie / zostanie wydrukowany. Śmiało i przetestuj to w C ++. W rzeczywistości wyróżnik składni SO pokaże, że jest poprawny. To nie jest złożony temat, istnieje od lat w innych językach. Poprosiłbym o zaktualizowanie postu, tak aby zawierał znaki specjalne, aby pokazać, że MOŻESZ użyć „* /” w kodzie.
Natalie Adams
23
co jeśli twój kod zawiera „”. Ups, twój kod zawiera ogranicznik komentarza końcowego
siamii
21
Komentarze wielowierszowe nie są z natury łamliwe; po prostu większość z nich to (w tym Python). Moim zdaniem oczywistym sposobem na wykonywanie wieloliniowych komentarzy w Pythonie jest po prostu umożliwienie mi rozpoczęcia bloku komentarza #:i użycie wcięcia, aby pokazać, kiedy komentarz się skończy. Jest czysty, spójny i doskonale radzi sobie z zagnieżdżaniem.
GatesDA
34

Tekst potrójny NIE powinien być uważany za komentarze wieloliniowe; Zwyczajowo są one docstrings . Powinny opisywać, co robi Twój kod i jak go używać, ale nie w przypadku komentowania bloków kodu.

Według Guido komentarze wieloliniowe w Pythonie są po prostu ciągłymi komentarzami jednowierszowymi (wyszukaj „komentarze blokowe”).

Aby skomentować bloki kodu, czasami używam następującego wzorca:

if False:
    # A bunch of code
Tryptyk
źródło
6
Wygląda na to, że Guido odtąd ćwiczył jego umysł .
Petr Viktorin
5
jeśli chodzi o rozwiązanie „if false:”, chodzi o to, że w Pythonie, który działa z tabulatorami, będziesz musiał tabulować cały kod pod „if False:”. A potem rozłupać kawałek. Więc musisz być całkiem sprytny z edytorem tekstu.
barlop
3
jeśli używasz porządnego edytora, powinien to być ten sam czas, co * /
AturSams,
@barlop yup - poznaj swoich redaktorów! Jest to zazwyczaj osiągalne w ciągu sekundy w vim zV}>>
Tryptyk
30

To prawdopodobnie wraca do podstawowej koncepcji, że powinien istnieć jeden oczywisty sposób wykonania zadania. Dodatkowe style komentarzy dodają niepotrzebne komplikacje i mogą zmniejszyć czytelność.

Jarred McCaffrey
źródło
8
To jest problem, jak sądzę: użycie ciągu jako komentarza nie jest oczywiste i narusza zasadę „jeden sposób na wykonanie zadania”, ponieważ istnieją dwa sposoby dodawania komentarzy: ciągi i #.
GatesDA
1
Ale nie różni się znacząco od tego, co masz w językach opartych na C: / * vs //, więc nie widzę, jak znacznie gorzej.
Ben Roberts,
// Zastanów się, DLACZEGO ktoś chciałby komentarza wieloliniowego. Powody: ... Naprawdę nie mogę wymyślić niczego poza „Nie muszę pisać tylu # tych doohickeys” i „Muszę wyświetlić ten konkretny komentarz w bardzo precyzyjny sposób, a ten precyzyjny sposób nie pozwalają na poprzedzenie #. ” Powiedz, że ktoś chce zrobić diagram ASCII lub umieść kod referencyjny javascript, który należy skopiować i wkleić, jeśli pojawi się określony problem. Jeden oczywisty sposób wykonania zadania nie obejmuje tutaj skrajnych przypadków tego zadania. Zgadzam się jednak, że dodatkowe style komentarzy są ZŁE.
Nathan Basanese
3
„Nie muszę wpisywać tylu # doohickeys”. Właśnie dlatego prawie wszystkie języki mają blokowane komentarze (/ * .. * /). Wierzcie lub nie, ale lubię dokumentować, co robi mój kod: dane wejściowe, dane wyjściowe, stosowane algorytmy, parametry ... To dużo tekstu, który również ulega modyfikacji. Ograniczenie tylko do komentarzy jednowierszowych jest po prostu śmieszne. Zauważ, że NIE opowiadam się za podejściem do komentowania kodu - chociaż jest to często przydatne przy wypróbowywaniu alternatywnych podejść, o ile dobrze znane możliwe skutki uboczne są zrozumiałe.
Albert Godfrind,
3
Inną rzeczą, której nie lubię w Pythonie, jest to, że jest to język zaprojektowany przez jednego człowieka. Cokolwiek Guido mówi, jest prawdą ... Mamy więc te wszystkie dziwne niezgodności między wersjami językowymi. Czemu ? Ponieważ Guido tak powiedział ...
Albert Godfrind,
12

Cóż, potrójne cudzysłowy są używane jako komentarze wielowierszowe w dokumentach. I # komentarze są używane jako komentarze wbudowane i ludzie przyzwyczajają się do tego.

Większość języków skryptowych również nie ma komentarzy wielowierszowych. Może to jest przyczyna?

Zobacz PEP 0008 , sekcja Komentarze

I sprawdź, czy Twój edytor Python oferuje skrót klawiszowy do komentowania bloków. Emacs obsługuje to, podobnie jak Eclipse, prawdopodobnie większość porządnych IDE.

Abgan
źródło
9

Z Zen Pythona :

Powinien być jeden - a najlepiej tylko jeden - oczywisty sposób na zrobienie tego.

Jeremy Cantrell
źródło
5

Osobiście mój styl komentowania mówi, że Java jest jak

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

Tak więc posiadanie komentarzy tylko w jednym wierszu nie jest takie złe, jeśli twój styl jest typowy dla poprzedniego przykładu, ponieważ w porównaniu miałbyś

#
# My multi-line comment in Python
#

VB.NET jest także językiem z komentarzami tylko jednowierszowymi, a ja osobiście uważam to za irytujące, ponieważ komentarze wyglądają mniej lubię komentarze, a bardziej jak jakiś cytat

'
' This is a VB.NET example
'

Komentarze zawierające tylko jedną linię kończą się mniejszym zużyciem znaków niż komentarze zawierające wiele wierszy, a może jakieś unikatowe znaki w wyrażeniu regularnym są mniej prawdopodobne? Ale raczej zgadzam się z Nedem.

Kezzer
źródło
5

Aby skomentować blok kodu w IDE Pycharm :

  • Kod | Komentarz z komentarzem liniowym
  • Windows lub Linux: Ctrl+/
  • Mac OS: Command+/
Craig S. Anderson
źródło
4
# This
# is
# a 
# multi-line
# comment

Aby to osiągnąć, użyj bloku komentarza lub wyszukaj i zamień (s / ^ / # / g) w edytorze.

rekurencyjny
źródło
3

Rozwiązałem to, pobierając makro do mojego edytora tekstu (TextPad), który pozwala mi wyróżniać linie, a następnie wstawia # na pierwszym wierszu. Podobne makro usuwa znaki #. Niektórzy mogą zapytać, dlaczego multiline jest konieczne, ale przydaje się, gdy próbujesz „wyłączyć” blok kodu na potrzeby debugowania.

kati
źródło
1

Dla każdego, kto szuka w Pythonie komentarzy zawierających wiele wierszy - użycie formatu potrójnej wyceny może mieć pewne problematyczne konsekwencje, ponieważ właśnie nauczyłem się na własnej skórze. Rozważ to:

this_dict = {
    'name': 'Bob',

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

    'species': 'Cat'
}

Komentarz składający się z wielu wierszy zostanie schowany do następnego ciągu, co zepsuje 'species'klucz. Lepiej użyć tylko #do komentowania.

Itamar Mushkin
źródło
0

Ponieważ konwencja # jest powszechna i naprawdę nie ma nic, co można zrobić z komentarzem wieloliniowym, czego nie można zrobić z komentarzem #-podpis. To historyczny wypadek, jak pochodzenie /* ... */komentarzy wracających do PL / I,

Charlie Martin
źródło
0

Załóżmy, że zostały po prostu uznane za niepotrzebne. Ponieważ tak łatwo jest pisać #a comment, komentarze wielowierszowe mogą składać się z wielu komentarzy jednowierszowych.

Z drugiej strony, w przypadku HTML potrzebne są multilinery. Trudniej jest pisać dalej <!--comments like this-->.

czerstwypretzel
źródło
4
nie o to chodzi - istnieją oczywiste przypadki użycia zarówno komentarzy jednowierszowych, jak i wieloliniowych. Używałem ich zarówno w innych językach (choć wiem, że purystom python nie obchodzą inne języki). ;)
johndodo
1
spróbuj zrobić to z 200 liniami kodu, które musisz wyjąć, włożyć z powrotem, a następnie wyjąć ponownie. Wpisanie 200 początkowych # szybko się zestarzeje.
DragonLord
0

To tylko przypuszczenie ... ale

Ponieważ są łańcuchami, mają pewną wartość semantyczną (kompilator ich nie pozbywa), dlatego sensowne jest, aby były używane jako ciągi znaków. W rzeczywistości stają się częścią AST , więc wyodrębnianie dokumentacji staje się łatwiejsze.

hasen
źródło
0

Poza tym komentarze wieloliniowe są suką . Przykro mi to mówić, ale niezależnie od języka nie używam ich do celów innych niż debugowanie. Powiedz, że masz taki kod:

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

Następnie dowiadujesz się, że w kodzie jest coś, czego nie można naprawić za pomocą debugera, więc zacznij ręcznie debugować to, komentując coraz mniejsze fragmenty kodu za pomocą tych komentarzy wielowierszowych. To dałoby wtedy funkcję:

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

To jest naprawdę irytujące.

martiert
źródło
3
Świetnie, ale Python nie ma /*komentarzy w stylu.
Tryptyk
17
Racja, ponieważ python nie ma prawdziwych komentarzy wielowierszowych, trudno było podać przykłady w pythonie.
martiert
2
Ja osobiście nie rozumiem problemu. Po prostu usuń dodatkowe * /. Lub użyj //, aby skomentować pojedyncze linie, jeśli chcesz być precyzyjny.
Natalie Adams
4
Istnieje kilka języków (wiele z nich działa z dowolnego powodu), które umożliwiają zagnieżdżanie komentarzy. Wyszukaj „zagnieżdżone” w rosettacode.org/wiki/Comments, aby znaleźć przykłady.
Keith,
1
cóż, tak irytujące byłoby umieszczenie komentarza zawierającego wiele wierszy w komentarzu zawierającym wiele wierszy. I chociaż pamiętam tylko trochę mojego programu na raz, przynajmniej pamiętam, którą część mojego programu oglądam, a więc to, co skomentowałem. Ale jeśli nawet tego nie pamiętasz, możesz użyć faktu, że niektóre IDE zapisują kursywą jako komentarz. W każdym razie, oczywiście, dla tak małej funkcji, równie dobrze możesz użyć komentarzy jednowierszowych. Ale jeśli komentujesz dużą część programu, naprawdę potrzebujesz wieloliniowego komentarza. lub edytor tekstu z tą funkcją.
barlop
0

Komentarze wielowierszowe przy użyciu IDLE na:

  • Mac OS X , po wybraniu kodu, skomentuj blok kodu za pomocą Ctrl+ 3i odkomentuj za pomocą Ctrl+ 4.

  • Windows , po wybraniu kodu, skomentuj blok kodu za pomocą Ctrl+ Alt+ 3i odkomentuj za pomocą Ctrl+ At+ 4.

Jorgesys
źródło
-1

Pamiętam, jak czytałem o jednym facecie, który umieściłby swoje komentarze wieloliniowe w potrójnej zmiennej:

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

Zajmuje to trochę pamięci, ale zapewnia funkcję komentowania wielu wierszy, a ponadto większość edytorów podświetli dla ciebie składnię :)

Łatwo jest również skomentować kod, po prostu owijając go

x = '''

i

'''
turvyc
źródło
18
usuń x =i nie zajmie to żadnej pamięci.
endolith