Pythonのコーディングスタイルとチェックツールのガイド
Olivia Novak
Dev Intern · Leapcell

Pythonのコーディングスタイルとチェックツールのガイド
Pythonのコーディングスタイルガイドは、固定されたものではありません。言語の発展とともに継続的に進化しています。古い慣習は徐々に廃止され、新しいものが次々と登場しています。同時に、多くのプロジェクトでは独自のコーディングスタイルガイドがあります。矛盾がある場合は、まずプロジェクト固有のガイドに従う必要があります。ただし、「一貫性への愚かな固執は無知の怪物である」という重要な原則を忘れてはなりません。これはGuidoからの深遠な洞察です。コードは書かれるよりも読まれることの方が多いため、スタイルガイドの主な目標は、コードの可読性を向上させ、あらゆる種類のPythonコードの一貫性を保つことです。PEP20が言うように、「可読性は重要です」。
スタイルガイドは一貫性を重視しています。ガイドと一貫性があることは重要ですが、プロジェクト内の一貫性はさらに重要であり、モジュールまたは関数内の一貫性は最も重要です。もちろん、スタイルガイドの一部を無視できる合理的な状況もあります。たとえば、ガイドを適用するとコードの可読性が低下する場合、周囲の過去のコードと一貫性があると全体的な構造が損なわれる場合、コードがガイドの前に登場し、変更する必要がない場合、コードが古いバージョンのPythonの機能と互換性がある必要がある場合などです。特に、PEPに従うためだけに後方互換性を破らないでください!
コードのレイアウト
インデント
- 各レベルのインデントには一律に4つのスペースを使用します。
- 垂直方向の暗黙的なインデントまたはぶら下げインデントは、括弧内で使用できます。ぶら下げインデントを使用する場合、最初の行にパラメーターを含めず、後続の行をインデントする必要があります。例:
# 開始デリミターに合わせる leapcell_foo = long_function_name(var_one, var_two, var_three, var_four) # 他のコードと区別するために、より多くのインデントを使用する def long_function_name( var_one, var_two, var_three, var_four): print(var_one) # ぶら下げインデント。追加のインデントレベルを追加する必要があります leapcell_foo = long_function_name( var_one, var_two, var_three, var_four)
連続した行では、4つのスペースのインデントは必須ではありません。
if
ステートメントが複数行にわたる場合、if
キーワードの後にスペース、次に左括弧がインデントを形成します。後続の行には、追加のインデントなし、コメントの追加、または追加のインデントの追加(推奨)など、複数の形式があります。
# 追加のインデントなし if (this_is_one_thing and that_is_another_thing): do_something() # コメントを追加 # 構文の強調表示をサポートします。 if (this_is_one_thing and that_is_another_thing): # 両方の条件が真であるため、frobnicateできます。 do_something() # 追加のインデントを追加することをお勧めします if (this_is_one_thing and that_is_another_thing): do_something()
- 閉じ括弧が新しい行にある場合、閉じ括弧をバックアップする形式をお勧めします。
# 閉じ括弧をバックアップする leapcell_my_list = [ 1, 2, 3, 4, 5, 6, ] leapcell_result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )
スペースまたはタブ
- スペースはインデントの推奨される方法です。
- タブでインデントされた既存のコードと一貫性を持たせる必要がある場合にのみ、タブを使用します。
- インデントにタブとスペースを混在させることは、Python 3では厳密に禁止されています。Python 2で混在したインデントを持つコードは、すべてスペースインデントに変換する必要があります。Python 2のコマンドラインインタープリターは、
-t
オプションを使用して不正な混在インデントに関する警告を発行でき、-tt
オプションは警告をエラーにアップグレードします。これら2つのオプションを使用することをお勧めします。同時に、pep8
およびautopep8
モジュールをお勧めします。
最大行幅
- すべてのコード行の最大幅は79文字に制限されており、ドキュメンテーション文字列またはコメントの行の長さは72文字に制限されています。
- チームが合意に達した場合、行幅を80〜100文字(最大99文字)に増やすことができますが、ドキュメンテーション文字列とコメントは、引き続き72文字の長さを維持することをお勧めします。Python標準ライブラリは、より保守的な行幅制限79文字を採用しています(ドキュメンテーション文字列/コメントの場合は72文字)。
- 行を継続する推奨される方法は、括弧、角括弧、および中括弧を使用することです。バックスラッシュは、
with
ステートメントなどの適切なシナリオで使用できます。
with open('/path/to/some/file/you/want/to/read') as leapcell_file_1, \ open('/path/to/some/file/being/written', 'w') as leapcell_file_2: leapcell_file_2.write(leapcell_file_1.read())
二項演算子の行継続
二項演算子で行を継続する場合、従来は演算子の後に改行することが推奨されていましたが、可読性に影響を与える可能性があります。数学の伝統に従い、通常、二項演算子の前に改行すると、コードの可読性が向上します。Pythonコードでは、ローカルで一貫性がある限り、演算子の前または後に改行できます。新しいコードでは、演算子の前に改行するKnuthスタイルを採用することをお勧めします。
# 演算子とオペランドを簡単に一致させることができます leapcell_income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
空行
- トップレベルの関数とクラスの定義は、2つの空行で区切られます。
- クラス内のメソッド定義は、単一の空行で区切られます。
- 必要に応じて、追加の空行を使用して、関数内の異なる関数グループまたは論理ブロックを区切ることができますが、過度の使用は避ける必要があります。
ソースファイルのエンコーディング
- コアPythonリリースのコードは、常にUTF-8(Python 2ではASCII)を使用する必要があります。
- ASCIIファイル(Python 2)またはUTF-8(Python 3)には、エンコーディング宣言は必要ありません。標準ライブラリのデフォルト以外のエンコーディングは、テスト用、または非ASCII文字(作成者名など)を含むコメントおよびドキュメンテーション文字列でのみ使用されます。この場合は、
\x
、\u
、\U
、または\N
を使用してみてください。 - Python 3.0以降のバージョンでは、PEP 3131を参照して、標準ライブラリではASCII識別子を使用し、英語の文字のみをできるだけ使用する必要があります。文字列とコメントも、非ASCII関数と非ラテンアルファベットの作成者名をテストする場合を除き、ASCIIである必要があります。
インポート
- インポートステートメントは、単一行を占有する必要があります。
# 正しい例 import os import sys # 間違った例 import sys, os
次の形式も使用できます。
from subprocess import Popen, PIPE
- インポートステートメントは、ファイルの先頭、モジュールのコメントとドキュメンテーション文字列の後、およびモジュールのグローバル変数と定数の前に配置する必要があります。インポートの順序は、標準ライブラリのインポート、関連するサードパーティライブラリのインポート、ローカルライブラリのインポートであり、各インポートグループを区切るために空行が使用されます。
all
関連のインポートは、他のインポートの後に配置する必要があります。- 絶対パスインポートを使用することをお勧めします。これは、読みやすく、パフォーマンスが向上するためです(または、少なくともより良いエラーメッセージを提供できます)。
import mypkg.sibling from mypkg import sibling from mypkg.sibling import example
絶対パスが長すぎる場合は、相対パスインポートを使用できます。
from . import sibling from .sibling import example
標準ライブラリのコードは、複雑なパッケージレイアウトを避け、常に絶対インポートを使用する必要があります。暗黙的な相対インポートは避ける必要があり、Python 3で削除する必要があります。
- クラスをインポートする場合、次のメソッドを使用できます。
from myclass import MyClass from foo.bar.yourclass import YourClass
ローカルの命名の競合がある場合は、次を使用できます。
import myclass import foo.bar.yourclass
- ワイルドカードインポート(
from <module> import *
)は、名前空間が不明確になるため禁止されています。外部APIを再公開する場合にのみ検討できます。
文字列の引用符
- Pythonでは、シングルクォート文字列とダブルクォート文字列は同じ機能を持っています。可読性を向上させるために、文字列内のバックスラッシュを避けるようにしてください。
- PEP 257に従い、トリプルクォート文字列はダブルクォートを使用する必要があります。
式とステートメントのスペース
- 括弧内にスペースを追加しないでください。
# 正しい例 spam(ham[1], {eggs: 2}) # 間違った例 spam( ham[ 1 ], { eggs: 2 } )
- 末尾のコンマと閉じ括弧の間にはスペースを入れないでください。
# 正しい例 leapcell_foo = (0,) # 間違った例 leapcell_bar = (0, )
- コンマ、コロン、セミコロンの前にスペースを入れないでください。
# 正しい例 if x == 4: print x, y; x, y = y, x # 間違った例 if x == 4 : print x , y ; x , y = y , x
- インデックス操作では、演算子としてのコロンは、前後に一貫したスペースが必要です(スペースを使用しないことをお勧めします)。
# 正しい例 ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset] # 間違った例 ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper]
- 関数呼び出しの左括弧の前にスペースを入れないでください。
# 正しい例 spam(1) dct['key'] = lst[index] # 間違った例 spam (1) dct ['key'] = lst [index]
- アライメントの目的で、代入演算子および他の演算子の前後に複数のスペースを追加しないでください。
# 正しい例 leapcell_x = 1 leapcell_y = 2 leapcell_long_variable = 3 # 間違った例 leapcell_x = 1 leapcell_y = 2 leapcell_long_variable = 3
コードチェックツール
ソフトウェアプロジェクトのメンテナンスプロセスでは、一貫したコーディングスタイルとテスト標準を維持することが重要です。これにより、メンテナンスの負荷を軽減し、新しい開発者がプロジェクトにすばやく慣れるのを支援し、アプリケーションの品質を保証できます。外部ライブラリを使用してコードの品質をチェックすることは、プロジェクトの保守性を維持するための効果的な手段です。以下は、一般的に使用されるPythonコードスタイルチェックおよびフォーマットツールです。
コードスタイルチェックツール
- Pylint:PEP 8仕様と一般的なエラーの違反をチェックするために使用されるライブラリ。人気のあるエディターやIDEに統合でき、コマンドラインからの実行もサポートしています。
pip install pylint
経由でインストールした後、pylint [options] path/to/dir
またはpylint [options] path/to/module.py
を使用してチェックすると、結果がコンソールに出力されます。pylintrc
構成ファイルを介してチェックルールをカスタマイズすることもできます。 - Flake8:PEP 8、Pyflakes(Pylintに類似)、McCabe(コードの複雑さチェッカー)、およびサードパーティのプラグインを統合しており、Pythonコードのスタイルと品質をチェックするために使用されます。インストールコマンドは
pip install flake8
であり、flake8 [options] path/to/dir
またはflake8 [options] path/to/module.py
を実行してエラーと警告を表示します。構成ファイルを介してチェックコンテンツをカスタマイズすることをサポートしています。ドキュメントには、開発ワークフローに統合できる便利なコミットフックが用意されています。Sublime TextのFlake8プラグインなど、プラグインを介してエディターまたはIDEに統合することもできます。 - Isort:プロジェクトでインポートされたライブラリをアルファベット順にソートし、標準ライブラリ、サードパーティライブラリ、自作ライブラリなどのパーツを正しく分割して、コードの可読性を向上させることができます。
pip install isort
を使用してインストールし、isort path/to/module.py
を実行します。.isort.cfg
ファイルを構成することにより、ライブラリの複数行のインポートを処理することもできます。人気のあるエディターやIDEとの統合もサポートしています。
コードフォーマットツール
- Autopep8:指定されたモジュールのコードを自動的にフォーマットできます。これには、線の再インデント、インデントの修正、冗長なスペースの削除、および一般的な比較エラー(ブール値やNone値など)のリファクタリングが含まれます。
pip install --upgrade autopep8
経由でインストールし、autopep8 --in-place --aggressive --aggressive
を実行してコードをフォーマットします。aggressive
オプションの数は、コードスタイルに対する制御の程度を決定します。 - Yapf:PEP 8仕様に違反している箇所を指摘するだけでなく、スタイルが一貫していないが仕様に違反していないコードをリフォーマットして、可読性を高めることができます。インストールコマンドは
pip install yapf
であり、yapf [options] path/to/dir
またはyapf [options] path/to/module.py
を使用してコードをフォーマットします。カスタマイズオプションの完全なリストで構成できます。 - Black:比較的新しいコードチェックツール。Autopep8やYapfと同様ですが、カスタマイズオプションが少なく、コードスタイルを手動で決定する必要はありません。Python 3.6以降に依存し、Python 2コードもフォーマットできます。
pip install black
経由でインストールし、black path/to/dir
またはblack path/to/module.py
を実行してコードを最適化します。制限されたカスタマイズオプションと構成方法を参照できます。
テストカバレッジチェックツール
Coverage:テストカバレッジを計算するために使用され、コンソールまたはHTMLページへの出力、および未カバーのコード行のマークなど、複数の表示方法を提供します。構成ファイルを介してチェックコンテンツをカスタマイズすることをサポートしています。インストールコマンドはpip install coverage
であり、coverage [path/to/module.py] [args]
を実行してプログラムを実行し、結果を表示します。coverage report -m
を使用して、未カバーのコード行を表示できます。
Leapcell:最高のサーバーレスWebホスティング
最後に、Pythonサービスのデプロイに最適なプラットフォームをお勧めします。Leapcell
🚀 お気に入りの言語で構築
JavaScript、Python、Go、またはRustで楽に開発。
🌍 無制限のプロジェクトを無料でデプロイ
使用量に応じてのみ支払い—リクエストも料金もありません。
⚡ 従量課金制、隠れたコストなし
アイドル料金は不要、シームレスなスケーラビリティ。
🔹 Twitterでフォローしてください:@LeapcellHQ