Pythonのコメント、コメントアウトの書き方

Modified: | Tags: Python

Pythonで説明をコメントとして記述したり不要なコードをコメントアウトしたりするには#を使う。

トリプルクォート(三重引用符)による文字列がコメントとして利用される場合もあるが、関数などに説明を加えるdocstring以外であえてトリプルクォートを使う理由はない。

"#"によるコメント、コメントアウト

インラインコメント

#から行末までは実行時に無視される。#より前のコードは有効。

a = 1  # comment
source: comment.py

行の途中の一部分を範囲指定してコメントとすることはできない。例えばコメント中にさらに#が含まれていてもそこでコメントが終わるわけではなく、最初の#以降はすべてコメントとなる。

a = 1  # comment # b = 2
source: comment.py

文字列中の#はそのまま#文字として扱われる。コメントにはならない。

s = 'abc # xyz'
source: comment.py

ブロックコメント(行全体)

#を行頭に書くとその行すべてがコメントとみなされ実行時には無視される。

# a = 1
source: comment.py

当然、対象の行すべての行頭に#を書けば複数行に渡ってコメントアウトされる。

a = 1
# b = 2
# c = 3
# d = 4
e = 5
source: comment.py

PEP8(コーディング規約)の推奨ルール

PEPはPython Enhancement Proposal(Python拡張提案)の略で、PEP8ではコーディング規約(スタイルガイド)について書かれている。#を使ったコメントについても推奨のルールが記載されている。

PEP8のルールを守らなくても文法上エラーになるわけではないが、所属組織やプロジェクトのコーディング規約が特にない場合はPEP8に従っておくとよいだろう。

pydocstyleやflake8などのコードチェッカーにおけるエラーコードとともにコメントの書き方のルールを示す。

インラインコメント

E261: at least two spaces before inline comment

インラインコメントの#の前には少なくとも2つのスペースを置く。

3つ以上でもOKだが、これはコメントの位置を揃える場合のため。不要なスペースは無いほうがいい。

# No:
a = 1 # comment

# Yes:
a = 1  # comment

a = 1      # comment
xyz = 100  # comment
source: comment.py

E262: inline comment should start with '# '

インラインコメントは#とスペースひとつから始める。#のあとにスペースが無くても2つ以上あってもダメ。

# No:
a = 1  #comment
a = 1  #  comment

# Yes:
a = 1  # comment
source: comment.py

ブロックコメント

E265: block comment should start with '# '

ブロックコメントはコメント内でインデントされたテキストでない限り#とスペースひとつから始める。#のあとにスペースが無いとダメ。

E262と異なりスペース2つ以上でもOKだが、これはコメント内でのインデントのため。不要なスペースは無いほうがいい。

# No:
#comment

# Yes:
# comment
#     indented comment
source: comment.py

E266: too many leading '#' for block comment

先頭の#はひとつだけ。

# No:
## comment

# Yes:
# comment
source: comment.py

トリプルクォートの複数行コメントとしての利用

関数(defブロック)やクラスなどの先頭の文字列に説明を記述するdocstring(ドキュメンテーション文字列)という仕組みがある。

def test(a, b):
    '''docstring
    description
    '''
    print(a)
    print(b)
source: comment.py

シングルクォート'、ダブルクォート"を3つつなげたトリプルクォート(''', """)で囲むことで改行を含めた文字列を生成できるため、docstringではトリプルクォートが使われることが多い。

文字列を単独で記述してもコードの処理に影響を与えないので、docstring以外でもトリプルクォート(三重引用符)が複数行のコメントやコメントアウトとして利用される場合がある。

a = 1
'''
b = 2
c = 3
d = 4
'''
e = 5
source: comment.py

ただし、トリプルクォート(三重引用符)はあくまでも文字列なので、#によるコメントのように実行時に無視されるわけではない。

例えば、インデントされているブロックの中でトリプルクォートをコメントとして利用しようとする場合、インデントをあわせないとエラーになる。

インデントがあっているとOK。

def test(a, b):
    print(a)
    '''
    comment line1
    comment line2
    comment line3
    '''
    print(b)
source: comment.py

インデントがあっていないとエラーIndentationError

def test(a, b):
    print(a)
'''
comment line1
comment line2
comment line3
'''
    print(b)

# IndentationError: unexpected indent
source: comment.py

#によるコメントは実行時に無視されるのでインデントがあっていなくてもエラーにはならない。もちろん、コードとしての可読性を良くするにはインデントをあわせたほうがいい。

def test(a, b):
    print(a)
    # comment line1
    # comment line2
    # comment line3
    print(b)

def test(a, b):
    print(a)
# comment line1
# comment line2
# comment line3
    print(b)
source: comment.py

いずれにせよトリプルクォートはコメントではなく文字列なので、公式の仕組みであるdocstring以外ではコメントとしてトリプルクォートを使わないほうが無難。

VS Codeなどのエディタでもショートカット(command + /またはcontrol + /)によるコメントアウトでは一行の場合も複数行の場合も#が使われる。

関数アノテーションによるコメント

Python3.0以降では関数アノテーション(Function Annotations)という仕組みによって関数の引数や返り値にアノテーション(注釈)となる式を記述できる。

def func_annotations_type(x: str, y: int) -> str:
    return x * y

関数アノテーションは単なる注釈なので、上の例のように型を記述した場合でも実行時に型チェックされたりはしないが、IDEやエディタによってはその情報をもとに処理を行うものもある。

詳細は以下の記事を参照。

関連カテゴリー

関連記事