🌏

Python、PEP8(ペップ・エイト)をざっくりまとめてみた♪

に公開

今回は、Python のコーディング規約、PEP8(ペップ・エイト)について、ざっくり、まとめていこーと思います!れっつらごー♪

PEP8: https://pep8-ja.readthedocs.io/ja/latest/


一貫性にこだわりすぎるのは、狭い心の現れである

pep8.py
import this
  • プロジェクトで一貫性を保つことが重要
  • 一番重要、特定のモジュールや関数の中で一貫性を保つこと
  • PEP に準拠するためにコードの後方互換性を壊すことは絶対しない

コードのレイアウト

  • 引数を区別するためインデントをスペース8つにする
pep8.py
def animal_name_function(
        dog_name, cat_name, lion_name):
    return dog_name, cat_name, lion_name
  • カッコでの改行、インデント入れる
pep8.py
dog_name, cat_name, lion_name = animal_name_function(
    'wanwan', 'nyanya', 'gaogao')
# 閉じカッコを改行してもよい
dog_name, cat_name, lion_name = animal_name_function(
    'wanwan', 'nyanya', 'gaogao'
)
# リストも同様
animal_list = [
    'dog', 'cat', 'lion']
animal_list = [
    'dog', 'cat', 'lion'
]
  • 1行の長さ:最大79文字に制限する

  • docstring やコメント、1行72文字に制限すべき

  • with 文の改行、バック・スラッシュが望ましい

  • 2項演算子の前で改行すべき

pep8.py
sales = (100_0000
         +200_0000
         +300_0000)
print(sales)
  • 空行

    • トップレベルの関数やクラス、2行ずつ空ける
    • クラス内部、1行ずつ空けてメソッドを定義する
    • 関数中では、ロジックの境目を示すため、空行を控えめに使う
  • エンコーディング、UTF-8 を使うべき


import(インポート)

  • 常にファイルの先頭、モジュール・コメントや docstring の直後、モジュールのグローバル変数や定数定義の前に置く
  • 通常は行をわける(注:インストールしてないとエラーになります)
pep8.py
import numpy
import pandas
  • これは OK
pep8.py
from ecdsa import SigningKey, VerifyingKey
  • 順番でグループ化(グループ間で1行空ける)
    1. 標準ライブラリ
    2. サードパーティ関連
    3. ローカル・アプリ/ライブラリに特有(その他?)

  • 引用符:単一(')か二重(")か一貫性を保つ

式や文中の空白文字

pep8.py
animal_list = ['cat', 'dog', 'lion', 'bird', 'deer']
animal_dict = {'cat': 1, 'dog': 2, 'lion': 3}
animal_tuple = ('cat',)
# スライスはスペースなし
print(animal_list[:3])
print(animal_list[2:4])
print(animal_list[::2])
a = 1
a += 1
b = a*2 + 5
# function
def add(a, b=1):
    return a + b
# 型ヒント
def add(a: int, b: int = 10):
    return a + b

  • 複合文は一般的に推奨されない(1行で書く if 文や、複数文を ; でつなげるなど)

コメント

  • コードを変更した時は、コメントを最新にする

  • 誰が見ても、明快かつ、わかりやすいコメントにする

  • 国外の人に120%読まれないと確信していなければ、コメントを英語で書いたほうがいい(お、おすっ)

  • ブロック・コメント

pep8.py
# first line
# Second line
  • インライン・コメント
    少なくとも文と2つのスペースを空け、 # とスペースから始めるべき
pep8.py
start_time = '8:00'  # japan time

ドキュメンテーション・文字列(docstrings)

  • すべての公開されているモジュールや関数、クラス、メソッドは docstring を書く
  • PEP257 は、良い docstring の規約
  • PEP257: https://peps.python.org/pep-0257/
  • 最も重要なのは、最後を """ だけからなる行で閉じること
pep8.py
"""Docstring
Return: Animal data
"""
  • 1行で終わる場合
pep8.py
""" Return: Animal data """

命名規則(推奨)

  • 最重要な原則:公開 API の一部としてユーザーに見える名前は、実装よりも使い方を反映した名前にすべき
  • 実践されている命名方法
    • 小文字1文字:a
    • 大文字1文字:A
    • 小文字のみ:animal
    • 小文字とアンダー・スコア:animal_name
    • 大文字:ANIMAL
    • 大文字とアンダー・スコア:ANIMAL_NAME
    • 単語の最初のみ大文字(CapWords 方式):AnimalName
    • 2単語目の最初の文字から大文字:animalName
    • 最初にアンダースコア:_animal(内部だけで使う)
    • 最後にアンダースコア:list_(Python のキーワードと衝突するのを避ける)

守るべき命名規則

  • モジュール名:小文字の短い名前にすべき(アンダー・スコア OK)
  • パッケージ名:小文字の短い名前にすべき(アンダー・スコア非推奨)
  • クラス名:単語の最初のみ大文字にすべき(CapWords 方式)
  • 例外の名前:最後に Error をつけるべき(例外はクラスであるべき)
  • 関数や変数の名前:小文字のみにすべき(必要に応じてアンダー・スコアを使うべき)
  • インスタンス・メソッドの引数:最初に self を使う
  • クラス・メソッドの引数:最初に cls を使う
  • メソッド名とインスタンス変数:小文字とアンダー・スコア(関数同様)
  • 公開されていないメソッドやインスタンス変数:先頭にアンダー・スコアをつける
  • 定数:大文字とアンダー・スコア

プログラミングに関する推奨事項

  • None との比較、is か is not を使うべき、絶対に等値演算子を使わない
  • 例外をキャッチする時、可能なときは特定の例外を指定する
  • try / except、try で囲む範囲を必要最小限のコードに限るようにする
  • return 文は一貫した書き方をする(すべて return を返すか、すべて返さないか)
  • プレフィックスやサフィックスのチェック、startswith() と endswith() を使う
  • オブジェクトの型の比較:isinstance() を使うべき
  • シーケンス(文字列、リスト、タプル)は、空のシーケンスが False であることを利用する
  • ブール型の値と True や False を比較するのに == を使わない(is はもっとダメ?)
pep8.py
animal = True
if animal:
    print('animal: True')
# こーゆことなのかな?と思います
animal = False
if not animal:
    print('animal: False')

関数アノテーション


変数アノテーション


今回のコード

GitHub: https://github.com/Animalyzm/mikoto_project
前回のファイルは、python/pep8.py です。


いやー、なかなか、むづーですね。。。
以上になります、ありがとうございましたー♪

Discussion