2012-08-08 10 views
5

Jak to się dzieje, że python reaguje na wcięcia komentarza?IndentationError z komentarza w python

def foo(): 
    """ 
    Random comment 
    """ 
    return True 

działa, ale:

def foo(): 
""" 
Random comment 
""" 
    return True 

nie działa, rzucając IndentationError.

Wydaje mi się dziwne, ponieważ komentarze nie powinny być niczym więcej niż komentarzami. A tak przy okazji, to działa:

def foo(): 
# Another random comment 
    return True 
+0

Prawdopodobnie oznacza to, że drugi fragment kodu * nie * rzuca 'IndentionError'. –

+2

@Tichodroma faktycznie OP oznacza, że ​​drugi fragment kodu nie działa, rzucając 'IndentationError' – elssar

+1

Ah, angielski tutaj w Stack Overflow! –

Odpowiedz

11

Potrójny cytat nie jest komentarzem; to jest doktryna metody. Możesz uzyskać do niego dostęp na przykład pod numerem foo.__doc__ później lub na przykład sformatować za pomocą help(foo). Potrącenie (""" lub ''') jest specyficzną dla Pythona metodą określania string literal, w której znaki nowej linii nie muszą być znakowane.

Jako taki jest częścią treści funkcji i dlatego musi zostać dopasowany. W rzeczywistości każdy ciąg występujący jako first statement of a function jest traktowany jako docstring, pojedyncze cytowanie też by działało. Ta sama sztuczka działa również w przypadku klas i modułów.

Wiele narzędzi może wykorzystać ten ciąg dokumentacji; na przykład w tej informacji można wstawić doctest tests. Zobacz PEP 257 dla konwencji dotyczących formatowania tego ciągu. Komentarze, z drugiej strony, są zawsze oznaczone przez # (gdzie nie jest częścią literału ciągłego) i są ignorowane do końca wiersza. Jeśli cała linia zawiera komentarz, cała linia jest ignorowana, podobnie jak linia z białymi znakami. Zobacz documentation on comments.

+1

Powinieneś dodać, że komentarze w Pythonie zaczynają się od '# 'i nic poza tym. –

+1

Sądzę, że zbyt mocno podkreślasz doctring-ness. Zagadnienie wcięcia nie ma nic wspólnego z docstrukcjami per se. Ma to związek tylko z łańcuchami. – BrenBarn

+0

z 'pep 257' musisz przeczytać sekcję komentarzy od' pep8' http://www.python.org/dev/peps/pep-0008/#comments –

1

Potrójnie cytowany ciąg nie jest komentarzem, jest literałem ciągowym. Nie jest ona przypisana ani użyta w żaden sposób przez twój kod, ale wciąż jest to zwykły ciąg i musi pasować do składni Pythona. (W tym przypadku jest to docstring, ale nie ma to nic wspólnego z tym, czy wcięcie ma dla niego znaczenie, czy nie).

# to sposób na komentarze.

+1

Nie przypisano lub nie użyto ?! –

+1

@Martijn Peters: Zakładam, że masz na myśli, że to jest docstring? To nie jest przypisane ani użyte w kodzie. Zdarza się, że jest to docstring, ale to nie ma nic wspólnego z tym, dlaczego wcięcie jest lub nie jest wymagane. Redagowałem, aby wyjaśnić, że to jest docstring. – BrenBarn

+1

Nie przypisany lub wykorzystany * w swoich przykładach tutaj *, ale * jest * przypisany! Twoje oświadczenie jest w najlepszym przypadku mylące. –