親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。育児のイロハという育児サイト(https://ikujip.jp)の開発も行っているため、その開発で使用されている技術についても掲載しています。

Pythonで日本語のコメントを入れる

Pythonの2系では、デフォルトでは日本語のコメントでエラーが発生する。

プログラムを書く上でコメントはとても大事ですね。
コメントがなくても読みやすいプログラムが書かれていれば問題ないのですが、そうも簡単にいかないのがプログラミング。。。
しかもチームでソースを書いてると、必ずソースをめちゃめちゃにして後から触る人を困らせるエンジニアっていますよね。

「この処理なんなんだよ、意味わかんないしそもそも使ってんの?」みたいなことはよくあるのではないでしょうか。

前フリはここまでにして、今回はPythonでコメントを入れて躓いた時の話です。
Pythonのバージョンとしては2系の話題になります。
理由は後述しますが、3系で同じような箇所で詰まった場合は別な対応が必要になると思います。

まず、Pythonでのコメントの書き方ですが、行の先頭に「#」を入れればOKです。
つまり、

# test comment out

のようにすれば大丈夫です。

しかし、日本語でコメントを入れたい場合、ただ単に「#」を入れるだけではダメなのです。
例えば、

# テストコメント

とすると、以下のようなエラーが出てしまいます。

SyntaxError: Non-ASCII character 'xe3' in file 〜 ファイル名 〜 on line 6,
but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

コメントアウトでエラーが出てしまうなんて意外ですよね。
要約すると、「アスキーコードじゃない文字列が含まれてるみたいだけど、何の文字コードエンコードをするか宣言してくれないと処理できないよ」といったところでしょうか。

Python2のデフォルトの文字コードはASCII

このエラーが発生する理由としては、Python2のデフォルトの文字コードが関係しています。
言語ごとにデフォルトのも文字コードが設定されていますが、Python2においてはASCIIコードがデフォルトになります。

https://ja.wikipedia.org/wiki/ASCII


にあるウィキペディアの説明を拝借しますと、「現代英語や西ヨーロッパ言語で使われるラテン文字を中心とした文字コード」「7桁の2進数で表すことのできる整数の数値のそれぞれに、大小のラテン文字や数字、英文でよく使われる約物などを割り当てた文字コード」とあります。
よって、そんな文字コードで日本語を入力したりすると、プログラムにおいては文字化けや上記のようなエラーなど、何らかの不具合が出たりするのです。

解決策は2つ

解決策としては2つですね。
厳密に言えば解決策の候補は2つですが、実際にプロジェクトで使える方法は後者の解決策2になります。

解決策1 コメントは全て英語で書く

ASCIIコードは日本語では不具合が出てしまいますが、英語(アルファベット)では問題なく動作します。
特に日本語で書く必要がないのであればこの方法で解決です。

ただ、英語を書く練習にはなるかもしれませんが、コメントとは後で見た時に分かりやすくするために残しておくもの。
チームメンバー全員が英語の読み書きができないと厳しいですよね。
わざわざこのエラーの解決策を探してこのページに辿り着いた人にとっては解決策にならないですよね。

解決策2 utf-8文字コードで書くことを宣言する

さて、こちらが根本解決になると思いますが、ソースの先頭に以下の記述を入れて、UTF-8で書いていることを宣言すればよいのです。

# -*- coding: utf-8 -*-

あくまで入れるのはソースの先頭(ファイルの1行目)であって、コメントの先頭ではないので気をつけてくださいね。
全ファイルの先頭にプログラムとは関係ない記述が入ることになってしまいますが、目立たない記述なので邪魔になることはないですよね。

まとめ

Pythonの2系はエンコード関係がほんとにキッチリしています。
他のプログラム言語では意識しないことなので、慣れるまで厄介かと思います。
3系になればデフォルトの文字コードutf-8になるようなので幾分楽になっているとは思いますが、まだプロジェクトの関係で2系を使わざる得ない人は大変ですよね。
コメントすら簡単にさせてくれないとは…
覚えるまで大変ですが、文字コードのことなど身に付くことも多いはずなので頑張りましょう!
頑張りましょう!

Python入門[2&3対応]

Python入門[2&3対応]