PythonのコードスタイルはPEP 8に一度目を通すことが良いと思います。コードのチェックツールでチェックすればいいのですが、その書き方を知らないとチェックだらけになってしまいます。
ですからコード書く時は、ある程度コードスタイルのルールを知っておく必要があります。
でも、ああいうドキュメントってなかなか読み込めないことがありますよね。自分に必要なレベルを考えると、自分のやろうとしていること以外の細かいところまで書かれているので、そこが読み込むことの手間になったりすることもあります。
ここではPEP8についての簡単なルールの実例を見て行こうと思います。
PEP8のルールや書き方を簡単に見ていく
それではPythonのコーディングのルールについて、実例を見ながら簡単にやって行きましょう。もちろん完全解説ではありませんのでそのあたりはご理解ください。
1行79文字
Atomを使っている人はファイルを開いてみるとわかると思いますが、画面に縦の線が薄く入っていると思います。
これ、何も知らずにみるとアプリのエラーとか液晶の傷かと思えて焦りますよね。これはAtomではコードの行の80文字目を示すラインです。
AtomのPreferencesからEditorを選択するとPreferred Line Lengthという項目があり、そこにデフォルトで「80」とセットされています。
Pythonのコーディングのルールではコードの1行の長さを79文字に制限しています。ですから、このラインを目安にコードをおさめたり、見やすく改行したりしましょう。別のエディタでも設定する項目があるはずです。
1行79文字の例外として、例えばドキュメントを関数定義に組み込んだ時、例えば参照サイトなどのURLを記述するようなことがあります。そのURLの文字列が長くて79文字を超えるようなものもあると思います。その場合は79文字は無視して構いません。
インデントの半角スペース4文字とタブ
Pythonのコードはインデントを半角スペース4文字でコードブロックを作りますが、半角スペースを4回入力するよりもタブで普通は行います。ただし、エディタの設定でこのタブの文字数が異なることがあるので半角4文字にセットしましょう。
あとハードタブとソフトタブという方式があり、ハードタブはまさにタブなのでインデントの半角スペース4文字として機能させるにはソフトタブでセッティングしましょう
Atomでは、上と同様の環境設定欄に項目があるのでこのあたりをセッティングしてもいいですが、Pythonファイルを編集する時は自動でルールが適用されているようです。
改行
他のプログラミング言語では改行時にセミコロン(;)をつけるものが多いと思います。
x = 100;
y = 50;
実はPythonでもこの書き方をしてもエラーにはなりません。ただし、Pythonではコードの読みやすさを重要視しているので、改行時にセミコロンをつけないことをルールにしています。
# 改行にはセミコロン(;)を使わない
x = 100
y = 50
関数定義などで、引数が多くなった時は見やすくするため改行する場合があります。
# def example_function(var_one, var_two, var_three, var_four):
# pass
def example_function(var_one, var_two,
var_three, var_four):
pass
このように改行したら丸括弧の位置で揃えます。
空行
メソッドやクラスの間などに空行(改行)を入れることにもルールがあります。
次のような要領で、空行2つ、空行1つを入れて行きます。
import os
GLOBAL_VAL_NAME = "example"
class Dummy():
def __init__(self):
pass
def sample(self):
pass
class Dummy2():
pass
def sample2():
pass
グローバルな位置にあるものは2行の空行を入れます。
モジュールをインポートしたら2行開けます。グローバル変数の間も2行開けます。クラス定義の間も2行開けます。グローバルな位置にある関数定義は2行開けますが、クラス内に定義されている関数は1行開けます。
余計な丸括弧
条件式などを作った時に、過度に丸括弧で区別をしすぎると読みにくくなるので余計な丸括弧はつけないようにします。次のような書き方ですね。
if (x and y): #優先順位を考える必要が無いので丸括弧は不要
pass
if x and y:
pass
どちらも同じ操作ですが、丸括弧はもっと条件があって計算の優先順位を考慮しないといけない場合に用いるべきで、丸括弧はこのように無駄になる場合にはつけないようにしましょう。
空白文字
変数や辞書、関数定義などカンマなどの区切りのあとは空白を入れるなど空白文字を入れるべきところと、入れ無いようにすべきところがあることに注意しましょう。
# x=y
x = y
# x+y
x + y
# a,b=b,a
a, b = b, a
# x = 100
# abc = 200
x = 100
abc = 200
# dic = {"1":"Python","2":"PHP"}
dic = {"1": "Python", "2": "PHP"}
# def example(x,y,z):
# pass
def example(x, y, z):
pass
def example(x, y, z, name="Python"):
pass
コメントアウトしてる書き方でも動きますが、見やすいように空白文字をそれぞれ開けています。イコールの位置を揃えようとして無駄に空白文字を入れるのはあとで変数が増えると再度揃える必要があるので、イコールの位置では揃えません。辞書型はコロンの後、カンマの後に空白文字を入れて見やすくします。関数の引数もカンマで区切って空白文字を入れますが、引数に値を入れる時はイコールの間に空白文字は入れません。
クォーテーション
クォーテーションはダブル(”)とシングル(’)がありますが、どちらを通常使って囲むのかを揃えておく方がいいでしょう。
通常はシングルで、中に代入などをするような処理がある時にダブルを使うというようなルールを決めておくと、それがコーディングの目印になったりします。
クラス名や関数名、変数名などの名前の書き方
別のところでも少し触れたと思いますが、クラス名や関数名などの書き方にも区別をつけておきます。1つの単語ではなく複数の単語を繋げた名前をつける時にはそれぞれ違いがあります。
GLOBAL_VAL = "Python" # グローバル変数は大文字
class CamelCace(): # クラス定義はキャメルケース
pass
def with_underscores(): # 関数定義、変数名はアンダースコアで繋げてスネークケース
user_message = "Hello!"
pass
グローバル変数はわかりやすいように大文字です。
クラス定義は先頭が大文字のキャメルケースで各単語の先頭を大文字にして繋げて書きます。
関数定義や変数は小文字を使って複数の単語はアンダースコアで繋げて書きます。これをスネークケースと呼びます。
インポートの書き方
モジュールのインポートの書き方は別のところでも書きました。
復習ついでにもう一度見て起きましょう。
import calendar #標準モジュール
import os
import time
import numpy #サードパーティモジュール
import scipy
import my_module #作成したモジュールパッケージ
import my_voice #ローカルファイル
順に標準モジュール、サードパーティモジュール、自作モジュール、ローカルファイルの順にそれぞれ1行開けてインポートしてます。各モジュールはabc順に並べます。
モジュールはカンマで区切ってまとめインポートして書いても動きますが、これはダメとされています。また、ドットで繋げてメソッドまで指定してインポートすることもできますが、どのパッケージなのかわからなくなるのでやらない方がいいとされています。
その他
辞書データのキーと値を出力するときなど、短いコードであれば、それぞれk,vを使って取り出せばいいのですが、意味がわかった方がいい場合があるので、場合によってはk,vではなく読んでわかる変数名をつけた方がいいです。
リスト内包表記など、1行で書けてとてもPythonらしい表現なのですが、いくつも内包表記を続けて1行でまとめすぎると長くなって読みづらくなるのでほどほどにしましょう。
ループ処理などでメモリをあまり消費しない書き方をすることも大切です。ただ、ここはなかなか難しいところですね。
まとめ
とても大雑把ですが、簡単にコーディングスタイル規約に関連する書き方を見てきました。
もっと細かいところもありますが、まずはこのあたりからスタートしてPEP8を個別に見ることをおすすめします。
また、ここで触れていないものでも、これまで扱ってきた内容の中で触れているものもあります。
見やすいコードを心がけて書いて行きましょう。ここで書いてきましたが、やれてない部分はやはりありますね。私もしっかり学んで行こうと思います。