Czy istnieje sposób tworzenia komentarzy wielowierszowych w Pythonie?


1156

Niedawno zacząłem studiować Python , ale nie mogłem znaleźć sposobu na wdrożenie komentarzy wieloliniowych. Większość języków ma symbole blokowego komentarza, takie jak

/*

*/

Próbowałem tego w Pythonie, ale generuje błąd, więc prawdopodobnie nie jest to właściwy sposób. Czy Python faktycznie posiada funkcję komentowania wielowierszowego?


2
Sądzę, że będąc językiem interpretowanym, ma to sens, jak w przypadku sh, bash lub zsh, #to jedyny sposób na komentowanie. Zgaduję, że dzięki temu łatwiej interpretować skrypty Pythona.
Victor Zamanian

1
Wiem, że ta odpowiedź jest stara, ale natknąłem się na nią, ponieważ miałem to samo pytanie. Akceptowana odpowiedź DZIAŁA, chociaż nie znam wystarczająco dużo języka Python, aby poznać zawiłości, dlaczego może on nie być poprawny (według ADTC).
Brandon Barney

5
@BrandonBarney Pozwól, że wyjaśnię ci problem. Zaakceptowana odpowiedź, która używa „”, w rzeczywistości tworzy ciąg wielu linii, który nic nie robi. Technicznie nie jest to komentarz. Na przykład możesz napisać k = '' 'fałszywy komentarz, prawdziwy ciąg znaków' ''. Następnie wydrukuj (k), aby zobaczyć, co oznacza ADTC.
pinyotae

3
To ma teraz o wiele więcej sensu. Jestem przyzwyczajony do vba, gdzie utworzenie nieużywanego ciągu powoduje błąd. Nie zdawałem sobie sprawy, że python po prostu go ignoruje. Nadal działa co najmniej do debugowania i uczenia się, ale nie jest dobrą praktyką do faktycznego rozwoju.
Brandon Barney,

W kodzie źródłowym Pythona, jeśli złamiesz długą linię, edytor automatycznie ją wcina, aby pokazać, że linia przerywana jest tak naprawdę częścią poprzedniej linii? Czy to powinienem zrobić, jeśli przełamię długą linię pseudokodu?
alpha_989

Odpowiedzi:


1802

Możesz użyć potrójnych cudzysłowów. Gdy nie są one dokumentacją (pierwszą rzeczą w klasie / funkcji / module), są ignorowane.

'''
This is a multiline
comment.
'''

(Upewnij się, że odpowiednio wcinasz wiodące, '''aby uniknąć IndentationError.)

Guido van Rossum (twórca Pythona) napisał na Twitterze jako „pro tip”.

Jednak przewodnik po stylu Pythona, PEP8, preferuje stosowanie kolejnych jednowierszowych komentarzy , i to również znajduje się w wielu projektach. Edytory tekstu zwykle mają do tego skrót.


17
Hm Umieściłem ogromny ciąg wielowierszowy w skrypcie Pythona, test.pyaby go zobaczyć. Kiedy to zrobię import test, test.pycplik zostanie wygenerowany. Niestety pycplik jest ogromny i zawiera cały ciąg w postaci zwykłego tekstu. Czy coś nie rozumiem, czy ten tweet jest niepoprawny?
unutbu

23
@unutbu, jeśli była to jedyna rzecz w pliku, była to dokumentacja. Umieść kod przed nim, a zniknie z pyc. Zredagowałem odpowiedź i umieściłem „moduł” na liście rzeczy, które zawierają dokumenty.
Petr Viktorin

31
Nie lubię ciągów wieloliniowych jako komentarzy. Podświetlanie składni oznacza je jako ciągi, a nie jako komentarze. Lubię używać porządnego edytora, który automatycznie zajmuje się komentowaniem regionów i zawijaniem komentarzy wieloliniowych podczas pisania. Oczywiście to kwestia gustu.
Sven Marnach,

61
Jako konwencja uważam, że pomocne jest stosowanie """do dokumentów i '''blokowania komentarzy. W ten sposób możesz '''ominąć swoje zwykłe dokumenty bez konfliktów.
Roshambo

19
Podczas gdy można użyć ciągi kilka linii jako komentarze multi-line, jestem zaskoczony, że żadna z tych odpowiedzi można znaleźć w podsekcji PEP 8 , które specyficznie zaleca konstruowania komentarzy obsługujący kilka linii z kolejnych komentarzach single-line z pustych #linii do odróżniają akapitów .
Air

82

Python ma wielowierszową składnię ciąg / komentarz w tym sensie, że jeśli nie zostanie użyty jako ciąg znaków , ciągi wielowierszowe nie generują kodu bajtowego - podobnie jak #wcześniejsze komentarze. W efekcie działa dokładnie jak komentarz.

Z drugiej strony, jeśli powiesz, że takie zachowanie musi być udokumentowane w oficjalnej dokumentacji, aby było prawdziwą składnią komentarza, to tak, słusznie powiesz, że nie jest to gwarantowane jako część specyfikacji języka.

W każdym razie edytor tekstu powinien mieć również możliwość łatwego komentowania wybranego regionu (umieszczając #przed każdym wierszem osobno). Jeśli nie, przejdź do edytora tekstu, który to robi.

Programowanie w Pythonie bez pewnych funkcji edycji tekstu może być bolesnym doświadczeniem. Znalezienie odpowiedniego edytora (i umiejętność jego używania) może mieć duży wpływ na postrzeganie doświadczenia w programowaniu w języku Python.

Edytor tekstowy powinien nie tylko móc komentować wybrane regiony, ale powinien także móc łatwo przesuwać bloki kodu w lewo i prawo, a także automatycznie ustawiać kursor na bieżącym poziomie wcięcia po naciśnięciu Enter. Przydatne może być również składanie kodu.


Aby zabezpieczyć się przed rozpadem linków, oto treść tweeta Guido van Rossuma :

@BSUCSClub Wskazówka dla Pythona: Możesz używać ciągów wielowierszowych jako komentarzy wielowierszowych. O ile nie są używane jako dokumenty, nie generują kodu! :-)


3
ciąg potrójnego cudzysłowu ('' ') rzeczywiście działa w celu wypełnienia komentarzy wieloliniowych.
Varun Bhatia

Dzięki .. Użyłem ('' ') i ("" ") do skomentowania bloku, ale nie pomogło mi to w aplikacjach Django. Więc wybrałem IDLE i są opcje takie jak Region komentowania i regiony Uncomment (skrót: Alt + Odpowiednio 3 i Alt + 4.) w menu Format . Teraz jest łatwiej niż kiedykolwiek ..
Saurav Kumar,

Powinieneś również rozważyć użycie IDE. Tak, są mocne, ale przy odpowiednim zastosowaniu mogą naprawdę skrócić czas kodowania. Osobiście korzystałem z PyDev, a teraz korzystam z PTVS (ze studiem wizualnym). Zdecydowanie polecam PTVS, ponieważ jest naprawdę miło pracować, zawierający powyższe funkcje i wiele więcej - bezpośrednią integrację z virtualenvs i naprawdę dobre debugowanie,
delikatnie mówiąc

2
@HappyLeapSecond Myślę, że powinieneś to wyjaśnić mówiąc: „Python nie ma prawdziwej składni komentarzy wielowierszowych, ale obsługuje ciągi wielowierszowe, które mogą być użyte jako komentarze”.
ADTC

3
To, czego chcę, to łatwy sposób komentowania całych bloków kodu podczas testowania. Inne języki to ułatwiają. Python to tylko ból.
Albert Godfrind,

45

Z zaakceptowanej odpowiedzi ...

Możesz użyć potrójnych cudzysłowów. Gdy nie są one dokumentacją (pierwszą rzeczą w klasie / funkcji / module), są ignorowane.

To po prostu nieprawda. W przeciwieństwie do komentarzy, ciągi potrójne są nadal analizowane i muszą być poprawne pod względem składniowym, niezależnie od tego, gdzie występują w kodzie źródłowym.

Jeśli spróbujesz uruchomić ten kod ...

def parse_token(token):
    """
    This function parses a token.
    TODO: write a decent docstring :-)
    """

    if token == '\\and':
        do_something()

    elif token == '\\or':
        do_something_else()

    elif token == '\\xor':
        '''
        Note that we still need to provide support for the deprecated
        token \xor. Hopefully we can drop support in libfoo 2.0.
        '''
        do_a_different_thing()

    else:
        raise ValueError

Dostaniesz albo ...

ValueError: invalid \x escape

... na Python 2.x lub ...

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 79-80: truncated \xXX escape

... w Pythonie 3.x.

Jedynym sposobem na komentarze wieloliniowe, które są ignorowane przez analizator składni, jest ...

elif token == '\\xor':
    # Note that we still need to provide support for the deprecated
    # token \xor. Hopefully we can drop support in libfoo 2.0.
    do_a_different_thing()

Następnie możesz użyć r'raw string'- r'\xor' == '\\xor'.
GingerPlusPlus

1
Cóż, każdy „prawdziwy” komentarz wieloliniowy musi również zostać przeanalizowany i poprawny pod względem składniowym. Komentarze w stylu C nie mogą zawierać znaku, */ponieważ spowoduje to na przykład blok.

1
@ dan1111 to oczywiste, że komentarz nie może zawierać znacznika końcowego, ale to jedyne ograniczenie.
el.pescado

14
'''„komentarze” mają więcej ograniczeń. Możesz komentować tylko całe wypowiedzi, podczas gdy komentarze mogą komentować części wyrażenia. Przykład: C, można skomentować pewne elementy listy: int a[] = {1, 2, /* 3, 4, */ 5};. W przypadku ciągu wieloliniowego nie można tego zrobić, ponieważ spowoduje to umieszczenie ciągu na liście.
el.pescado

35

W Pythonie 2.7 komentarzem wielowierszowym jest:

"""
This is a
multilline comment
"""

Jeśli jesteś w klasie, powinieneś ją odpowiednio tabulować.

Na przykład:

class weather2():
   """
   def getStatus_code(self, url):
       world.url = url
       result = requests.get(url)
       return result.status_code
   """

20
potrójne cudzysłowy to sposób na wstawienie tekstu, który nic nie robi (uważam, że można to zrobić również ze zwykłymi ciągami pojedynczego cudzysłowu), ale nie są to komentarze - interpreter faktycznie wykonuje wiersz (ale wiersz nie robi nic nie robić). Dlatego ważne jest wcięcie potrójnego „komentarza”.
Demis,

12
To rozwiązanie jest niepoprawne, weather2komentarz jest tak naprawdę dokumentem, ponieważ jest to pierwsza rzecz w klasie.
Ken Williams

Zgadzam się z @KenWilliams. To nie jest poprawne rozwiązanie. Spróbuj umieścić to w środku funkcji / klasy i zobacz, jak to popsuje twoje formatowanie i automatyzację zwijania / szuflowania kodu.
alpha_989

25

AFAIK, Python nie ma blokowanych komentarzy. Aby komentować poszczególne linie, możesz użyć #znaku.

Jeśli używasz Notepad ++ , istnieje skrót do komentowania bloków . Jestem pewien, że inni, tacy jak gVim i Emacs, mają podobne funkcje.


2
to jest niepoprawne, zobacz odpowiedzi na temat używania potrójnych cudzysłowów.
Fernando Gonzalez Sanchez

10
@FernandoGonzalezSanchez: To naprawdę nie jest niepoprawne. Ten „wieloliniowy ciąg znaków jako komentarz” można najlepiej opisać jako „pro-tip”. Oficjalne dokumenty Pythona nic na ten temat nie mówią, stąd pytanie zadane przez OP.
Sanjay T. Sharma

8
To jest PEP dla dokumentów; na tej stronie nie ma ani jednej wzmianki o „komentarzach”.
Sanjay T. Sharma

12

Myślę, że tak nie jest, z wyjątkiem tego, że łańcuch wielowierszowy nie jest przetwarzany. Jednak większość, jeśli nie wszystkie środowiska IDE Pythona, mają skrót do komentowania wielu linii kodu.


11

Jeśli dodasz komentarz

"""
long comment here
"""

w środku skryptu Python / linters tego nie rozpoznają. Składanie zostanie pomieszane, ponieważ powyższy komentarz nie jest częścią standardowych zaleceń. Lepiej jest użyć

# Long comment
# here.

Jeśli używasz Vima , możesz używać wtyczek takich jak commentary.vim , aby automatycznie komentować długie linie komentarzy, naciskając Vjgcc. Gdzie Vjwybiera dwa wiersze kodu i gcckomentuje je.

Jeśli nie chcesz używać wtyczek takich jak powyżej, możesz użyć wyszukiwania i zastąpić podobne

:.,.+1s/^/# /g

Zastąpi to pierwszy znak w bieżącym i następnym wierszu #.


8

Nie ma takiej funkcji jak komentarz wieloliniowy. #jest jedynym sposobem skomentowania pojedynczej linii kodu. Wielu z was odpowiedziało na ten komentarz jako swoje rozwiązanie.

Wygląda na to, że działa, ale wewnętrznie '''w Pythonie przyjmuje wiersze ujęte w regularne ciągi znaków, których interpreter nie ignoruje przy użyciu komentarzy #.

Sprawdź oficjalną dokumentację tutaj


5

Niestety, nie zawsze można użyć skreślenia jako komentarza! Dlatego bezpieczniej jest trzymać się standardu, poprzedzając każdą linię znakiem #.

Oto przykład:

test1 = [1, 2, 3, 4,]       # test1 contains 4 integers

test2 = [1, 2, '''3, 4,'''] # test2 contains 2 integers **and the string** '3, 4,'

4

Cóż, możesz wypróbować to (podczas uruchamiania cytowanego wejścia do pierwszego pytania należy zacytować '):

"""
print("What's your name? ")
myName = input()
print("It's nice to meet you " + myName)
print("Number of characters is ")
print(len(myName))
age = input("What's your age? ")
print("You will be " + str(int(age)+1) + " next year.")

"""
a = input()
print(a)
print(a*5)

Cokolwiek """będzie zawarte, zostanie skomentowane.

Jeśli szukasz komentarzy jednowierszowych, to jest #.


3

Komentarz wieloliniowy w Pythonie:

U mnie zarówno „” ”, jak i„ ”„ działały.

Przykład:

a = 10
b = 20
c = a+b
'''
print ('hello')
'''
print ('Addition is: ', a+b)

Przykład:

a = 10
b = 20
c = a+b
"""
print('hello')
"""
print('Addition is: ', a+b)

3

Komentarze wbudowane w Pythonie zaczynają się od znaku skrótu.

hello = "Hello!" # This is an inline comment
print(hello)

Dzień dobry!

Zauważ, że znak skrótu w dosłownym ciągu jest po prostu znakiem skrótu.

dial = "Dial #100 to make an emergency call."
print(dial)

Wybierz # 100, aby wykonać połączenie alarmowe.

Znak skrótu może być również użyty do komentarza w jednym lub w wielu wierszach.

hello = "Hello"
world = "World"
# First print hello
# And print world
print(hello)
print(world)

Witaj

Świat

Dołącz tekst potrójnymi podwójnymi cudzysłowami w celu obsługi dokumentów.

def say_hello(name):
    """
    This is docstring comment and
    it's support multi line.
    :param name it's your name
    :type name str
    """
    return "Hello " + name + '!'


print(say_hello("John"))

Cześć John!

Dołącz tekst potrójnymi pojedynczymi cudzysłowami do komentarzy blokowych.

'''
I don't care the parameters and
docstrings here.
'''

2

W Pythonie 2.7.13:

Pojedynczy:

"A sample single line comment "

Multiline:

"""
A sample
multiline comment
on PyCharm
"""

2
Mówisz, że pojedyncze cudzysłowy tworzą komentarz w Pythonie 2.7?
mcalex,

3
Użycie jednego zestawu cytatów tworzy ciąg. Komentarz do jednego wiersza powinien być poprzedzony znakiem #.
johanno

2

Uniwersalny oficjalny wieloliniowy przełącznik komentarzy Visual Studio Code .

macOS: wybierz blok kodu, a następnie +/

Windows: wybierz blok kodu, a następnie Ctrl+/


2

Tak, można używać obu:

'''
Comments
'''

i

"""
Comments
"""

Ale jedyną rzeczą, o której wszyscy musicie pamiętać podczas pracy w środowisku IDE, jest „URUCHOMIENIE” całego pliku, aby zaakceptować go jako kody wielu linii. Linia po linii „RUN” nie będzie działać poprawnie i wyświetli błąd.


1

Aby skomentować wiele wierszy kodu w Pythonie, wystarczy użyć #komentarza jednowierszowego w każdym wierszu:

# This is comment 1
# This is comment 2 
# This is comment 3

Do pisania „poprawnych” komentarzy wieloliniowych w Pythonie należy używać ciągów wieloliniowych ze """składnią Python ma funkcję ciągów dokumentacji (lub ciągów dokumentów). Daje to programistom łatwy sposób dodawania szybkich notatek do każdego modułu, funkcji, klasy i metody Pythona.

'''
This is
multiline
comment
'''

Wspomnij również, że możesz uzyskać dostęp do dokumentów przez obiekt klasy taki jak ten

myobj.__doc__

Co to dodaje do poprzednich odpowiedzi?
Peter Mortensen

Moja odpowiedź zawiera więcej szczegółów, które mogą bardziej pomóc programistom.
shafik


1

Odradzam używanie """komentarzy wieloliniowych!

Oto prosty przykład podkreślający to, co można uznać za nieoczekiwane zachowanie:

print('{}\n{}'.format(
    'I am a string',
    """
    Some people consider me a
    multi-line comment, but
    """
    'clearly I am also a string'
    )
)

Teraz spójrz na wynik:

I am a string

    Some people consider me a
    multi-line comment, but
    clearly I am also a string

Ciąg wielowierszowy nie był traktowany jako komentarz, ale został połączony z 'clearly I'm also a string'jednym ciągiem.

Jeśli chcesz skomentować wiele wierszy, zrób to zgodnie z wytycznymi PEP 8 :

print('{}\n{}'.format(
    'I am a string',
    # Some people consider me a
    # multi-line comment, but
    'clearly I am also a string'
    )
)

Wynik:

I am a string
clearly I am also a string

Czy nie powinno być „ lang-bash” zamiast „ bash dla podświetlania składni? W każdym razie zazwyczaj wygląda to dziwnie (np. Dla „niektórych” tutaj) - nawet jeśli w rzeczywistości są to polecenia wiersza polecenia z parametrami. lang-none(podświetlanie składni wyłączone) może być lepszym wyborem.
Peter Mortensen

@PeterMortensen dzięki za wskazanie dziwnego wyróżnienia naszego! Poszedł z „lang-none”.
jojo

0

Korzystanie z PyCharm IDE.

Możesz commenti uncommentwiersze kodu za pomocą Ctrl + /. Ctrl + / komentarze lub odkomentuje bieżącą linię lub kilka wybranych linii z komentarzami jednowierszowymi ({# in Django templates, or # in Python scripts). Pressing Ctrl+Shift+/dla wybranego bloku kodu źródłowego w szablonie Django otacza ten blok {% comment %} and {% endcomment %}znacznikami.


n = 5
while n > 0:
    n -= 1
    if n == 2:
        break
    print(n)

print("Loop ended.")

Wybierz wszystkie linie, a następnie naciśnij Ctrl + /


# n = 5
# while n > 0:
#     n -= 1
#     if n == 2:
#         break
#     print(n)

# print("Loop ended.")

0

Komentarz wielowierszowy w rzeczywistości nie istnieje w Pythonie. Poniższy przykład składa się z nieprzypisanego ciągu, który jest sprawdzany przez Python pod kątem błędów składniowych.

Kilka edytorów tekstu, takich jak Notepad ++ , udostępnia skróty do komentowania napisanego fragmentu kodu lub słów.

def foo():
    "This is a doc string."
    # A single line comment
    """
       This
       is a multiline
       comment/String
    """
    """
    print "This is a sample foo function"
    print "This function has no arguments"
    """
    return True

Ponadto Ctrl+ Kjest skrótem w Notepad ++ do blokowania komentarzy. Dodaje #przed każdą linię pod zaznaczeniem. Ctrl+ Shift+ Koznacza blokowanie komentarzy.


0

Wśród innych odpowiedzi uważam, że najprostszym sposobem jest użycie funkcji komentowania IDE, które korzystają z obsługi komentarzy Pythona #.

Używam Anaconda Spyder i ma:

  • Ctrl+ 1- Komentarz / brak komentarza
  • Ctrl+ 4- Skomentuj blok kodu
  • Ctrl+ 5- Odkomentuj blok kodu

Skomentuje / odkomentuje pojedynczy / wieloliniowy kod / -y kodu #.

Uważam to za najłatwiejsze.

Na przykład komentarz blokowy:

# =============================================================================
#     Sample Commented code in spyder
#  Hello, World!
# =============================================================================

Dzięki @PeterMortensen za edycję :)
aniltilanthe

-2

Wybierz linie, które chcesz skomentować, a następnie użyj Ctrl+, ?aby skomentować lub odkomentować kod Pythona w edytorze Sublime Text .

W przypadku pojedynczej linii możesz użyć Shift+ #.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.