(2024年7月20日)docstringについて加筆
サンプル・プログラム
コメント
Python では、ハッシュ # から行末をコメントとして認識し、プログラムには何の影響も与えないようになっている。また空行も何の影響も及ぼさない。
# メイン・プログラム =======================================================
# キーボードから入力する(文字列).
startStr = input("開始=")
goalStr = input("終了=")
このプログラムでは "メイン・プログラム =======", "キーボードから入力する(文字列)." がコメントとして認識される。
# 文字色のエスケープシーケンス
COLOR_CYAN = "\033[36m" #シアン
COLOR_GREEN = "\033[32m" #緑色
COLOR_YELLOW = "\033[33m" #黄色
COLOR_END = "\033[0m" #終了
ハッシュ # から行末までがコメントとして認識されるから、このプログラムでは "文字色のエスケープシーケンス" は1行丸ごと、"シアン", "緑色"‥‥はハッシュから行末までをコメントとして認識する。
Python ではコメントの書き方ルールはないが、変数のコメントは、その変数の右や、コメントが長いときには、変数の上1行に書くといいだろう。
プログラムをUTF-8で書いていれば、コメントに日本語やギリシア文字、絵文字を含めることができる。業務用でなければ、絵文字を使って、その時の気分をコメントするのもいいかもしれない。
Python ではコメントの書き方ルールはないが、変数のコメントは、その変数の右や、コメントが長いときには、変数の上1行に書くといいだろう。
プログラムをUTF-8で書いていれば、コメントに日本語やギリシア文字、絵文字を含めることができる。業務用でなければ、絵文字を使って、その時の気分をコメントするのもいいかもしれない。
docstring
Python では、連続する3つのダブルクォーテーション """ があると、再び """ が表れるまでを1つの文字列の塊をみなす。これを文字列リテラルと呼ぶ。
文字列リテラルを使うことで、C/C++言語に備わっている複数行コメント "/* ... */" と同じコメントを書くことができる。これを Python では docstring と呼ぶ。
docstring は、ユーザー定義関数やユーザー定義クラスの説明に使うことが多い。
公式の PEP 257 で書き方を定めているが、概念的に過ぎる部分が多いので、この連載では Googleスタイルを利用することにする。
文字列リテラルを使うことで、C/C++言語に備わっている複数行コメント "/* ... */" と同じコメントを書くことができる。これを Python では docstring と呼ぶ。
docstring は、ユーザー定義関数やユーザー定義クラスの説明に使うことが多い。
公式の PEP 257 で書き方を定めているが、概念的に過ぎる部分が多いので、この連載では Googleスタイルを利用することにする。
def sumNumbers(fromInt, toInt):
"""fromIntからtoIntまでの整数を合計する.
Args:
fromInt(int): 開始値
toInt(int): 終了値
Returns:
int: 合計値
"""
n = 0
for i in range(fromInt, toInt + 1):
n += i
return n
文字列リテラルは、コメントと異なり文字列データとして扱われるため、関数内部に書くときは、上記のようにインデントを空ける必要がある。
Googleスタイルは下記のような構造をもつ。
Returns セクションは戻り値を説明する。
Raises セクションは例外処理を説明する。
Examples セクションは関数やクラスの使い方を説明する。
Attributes セクションはクラスの属性を説明する。
ToDo セクションは今後実装予定の処理などを記載する。
Note セクションには、その他何でも書くことができる。
なお、すべてのセクションを書く必要はない。
このように関数内に記載した文字列リテラルは、そのオブジェクトのコメントになる。ここでは、組み込み関数の help関数を使い、"help(sumNumbers)" と追記してやると、文字列リテラルの内容を数のように画面に出力する。ヘルプ機能を作るときに役立つだろう。
Googleスタイルは下記のような構造をもつ。
"""1行説明文Args セクションは引数を説明する。インスタンスを示すselfは省略する。省略可能な引数は 引数の名前(引数の型, optional): 説明 のように記載する。
(空行)
より詳しい説明
(空行)
Args:
引数1の名前(引数1の型): 説明1
引数2の名前(引数2の型): 説明2
...
(空行)
Returns:
戻り値の型: 説明
(空行)
Raises:
例外の名前: 説明
(空行)
Examples:
関数やクラスの使い方
(空行)
Attributes:
クラス属性1の名前(属性1の型): 説明1
クラス属性2の名前(属性2の型): 説明2
...
(空行)
ToDo:
今後実装予定の処理など
(空行)
Note:
その他何でも
"""
Returns セクションは戻り値を説明する。
Raises セクションは例外処理を説明する。
Examples セクションは関数やクラスの使い方を説明する。
Attributes セクションはクラスの属性を説明する。
ToDo セクションは今後実装予定の処理などを記載する。
Note セクションには、その他何でも書くことができる。
なお、すべてのセクションを書く必要はない。
このように関数内に記載した文字列リテラルは、そのオブジェクトのコメントになる。ここでは、組み込み関数の help関数を使い、"help(sumNumbers)" と追記してやると、文字列リテラルの内容を数のように画面に出力する。ヘルプ機能を作るときに役立つだろう。
help関数 は、Linuxではmanコマンドのように画面表示する。つまり、qキーを押下すると、次のヘルプへ進む。
文字列リテラルについては、「3.8 文字列」で詳しく取り上げる。
バージョンアップ履歴
一定の機能を備えたプログラムやモジュール・ファイルについては、そのバージョンアップ履歴をコメントで書いておくと、不具合対策や、運用チームへ引継ぎを行うときに役に立つ。
# バージョンアップ履歴 ======================================================
def updates():
"""バージョンアップ履歴
Version:
1.2.0: 2024/07/19 docstringをGoogleスタイルに変更
1.1.0: 2024/06/15 標題、バージョンアップ履歴等のコメント追加
1.0.0: 2024/06/08 初版
"""
# ヘルプ情報を表示
help(userFunc4_py)
help(sumNumbers)
help(updates)
バージョンアップ履歴の書き方にルールはないのだが、このシリーズでは、プログラム・ファイルの末尾にユーザー定義関数 updates に文字列リテラルを使ってバージョンアップ履歴を書いている。
このプログラムの中で、"help(updates)" と追記してやると、文字列リテラルに記したバージョンアップ履歴を画面に表示する。
このプログラムの中で、"help(updates)" と追記してやると、文字列リテラルに記したバージョンアップ履歴を画面に表示する。
標題、権利、注意事項など
一定の機能を備えたプログラムやモジュール・ファイルについては、その標題や機能、知的財産権の主張、注意事項などを書いておくと、オープンソースとして公開したときに役に立つだろう。
def userFunc4_py():
"""fromIntからtoIntまでの整数を合計する関数.
Copyright:
(c)studio pahoo, パパぱふぅ
Environment:
Python 3.7 or after + Matplotlib
Note:
Python入門 - 2.5 コメントを書こう
https://www.pahoo.org/e-soul/webtech/python00/py00-02-05.html
"""
これもルールはないのだが、このシリーズでは、プログラム・ファイルの冒頭にプログラム・ファイル名に似せたユーザー定義関数を置き、文字列リテラルを使って上記の情報を記載する。
練習問題
次回予告
本章は、データの入出力、四則演算と算術関数、ユーザー定義関数、そして入力バリデーションを通じて、Pythonを使って簡単なプログラムを作るところまでを履修した。
このあとは、Pythonの文法を掘り下げて、より高度なプログラムを作ることを目指す。次章では、変数と式について説明する。
このあとは、Pythonの文法を掘り下げて、より高度なプログラムを作ることを目指す。次章では、変数と式について説明する。
コラム:アセンブラ、コンパイラ、インタプリタ
機械語の命令を、それに近い英単語(または略号)に置き換えたものがアセンブリ言語と呼ばれるプログラミング言語である。人間が読むことはできるが、CPUの種類によって変わることは同じで、そのCPUの命令体系を熟知していないと理解は難しい。アセンブラ言語で書かれたプログラムは、アセンブラを介して機械語に翻訳され、CPUが直接実行できた。
当時の高級言語は、コンパイラという仕組みを介して、各々のCPUに合ったアセンブラ言語に翻訳され、最終的にCPUが直接実行できる機械語にしてから実行するというものだった。
PythonはCPUに依存しないが、コンパイラを介してプログラムを実行しているわけではない。実行環境が、ファイルやメモリからプログラムを逐次読み出ししてCPUに実行させている。このような仕組みをインタプリタと呼ぶ。
PythonはCPUに依存しないが、コンパイラを介してプログラムを実行しているわけではない。実行環境が、ファイルやメモリからプログラムを逐次読み出ししてCPUに実行させている。このような仕組みをインタプリタと呼ぶ。
かつては、コンパイラで作られたプログラムはインタプリタより実行速度が速かったのだが、最近のコンパイラは純粋なアセンブリ言語に翻訳しなかったり(例:Java、C#)、逆にインタプリタでもコンパイル機能を備えたもの(例:PHPのJIT)が登場したことなどにより、両者の境界は曖昧になっている。
(この項おわり)
自分専用のプログラムだとしても、書いてから3日もすれば、細かいロジックなど忘れてしまう。
そこで、プログラムの流れや、変数、関数の役割を補足する意味で、プログラム中にコメントを書く習慣を付けよう。