PEP8 を読んでみよう
Python東海 第24回勉強会
2014年5月24日
@2box2bo
自己紹介
• 名前:坪内 由孝

@2box2bo

• ブログ:http://www.zumwalt.info/blog
• お仕事:地方えすあいあーのインフラ屋
• 所属:(☝ ՞ਊ ՞)☝ウィーンなユーザー会

Python東海
• 最近のあれ:榛名は大丈夫です!

(´;ω;`)ブワッ

PEP
PEP とはなんぞ?
• 「Python Enhancement Proposal」の略

日本語訳すると「Python拡張提案」
• Python コミュニティに情報提供や新機能・

プロセス・環境等を説明するための設計書
• 技術的な仕様とその機能が必要な論理的な

理由を提供する
PEP8
PEP8 とはなんぞ?
• PEPの8番目 

タイトルは「Style Guide for Python Code」
• 内容はコーディングスタイルのガイド
• 日々、時代にあった物に変わっていく
• 自分が所属している組織のコーディングスタイルと
競合したら自組織のコーディングスタイルを優先
"A Foolish Consistency is
the Hobgoblin of Little
Minds"
愚かな一貫性は狭い心が化けた
ものである
• コードは書かれるよりもずっと多く読まれる
• スタイルガイドは一貫性のためにある
• 一番重要な事は、一貫性を諦める、スタイル
ガイドを適用しない タイミングを知る事
• PEP8 に従うために後方互換性を壊すことは絶
対にしない
Code lay-out
Indentation
インデント1
• 1 段階のインデントには 4 つのスペースを使う
• 継続行のインデントはその次のインデントと
区別できるようにする
def long_function_name(	
var_one, var_two, var_three,	
var_four):	
print(var_one)
インデント2
• カッコによる暗黙の行継続を使っている場合、
縦に えるか「吊り下げインデント」を使う
• 「吊り下げインデント」を使っている場合は
最初の行に引数を置かないこと。
foo = long_function_name(var_one, var_two,	
var_three, var_four)	
foo = long_function_name(	
var_one, var_two,	
var_three, var_four)
インデント3
• 複数行に渡るカッコの閉じカッコはその行の

最初の空白でない文字のインデントに える
• もしくは、その複数行の要素が開始した

インデントに える
my_list = [	
1, 2, 3,	
4, 5, 6,	
]	
result = some_function_that_takes_arguments(	
'a', 'b', 'c',	
'd', 'e', 'f',	
)
インデント4
# NG 1	
foo = long_function_name(var_one, var_two,	
var_three, var_four)	
!
# NG 2	
def long_function_name(	
var_one, var_two, var_three,	
var_four):	
print(var_one)
「吊り下げインデント」を使う場合は
最初の行に引数を書いてはいけない
次のインデントと区別できるようにする
Tabs or Spaces?
タブかスペースか?
• インデントにはスペースを推奨
• タブを使っていいのは既にタブでインデントさ
れているコードと一貫性を保つ場合のみ
• Python3 ではインデントにタブとスペース

両方使うことを許可しない
• Python2 用のコードで両方使われている場合は

スペースのみに変換する
Maximum Line Length
行の長さの最大値1
• 全ての行は79文字以内
• docstring やコメントは72文字
• チームで合意が取れれば99文字まで増やしても良い
‘’’	
最大72文字	
!
‘’’	
!
# 最大72文字	
!
def aaa():	
print “標準的には79文字、最大99文字”
行の長さの最大値2
• 行が長い場合はカッコでの暗黙的な行継続かバッ
クスラッシュを使って書く
• カッコでの行継続を優先して書く
• with、assertではバックスラッシュを使用する
with open('/path/to/some/file/you/want/to/read') as file_1, 	
open('/path/to/some/file/being/written', 'w') as file_2:	
file_2.write(file_1.read())
行の長さの最大値3
• 継続行を適切にインデントする
• 2項演算子で改行する場合は演算子の後ろで

改行するのが推奨
class Rectangle(Blob):	
!
def __init__(self, width, height,	
color='black', emphasis=None, highlight=0):	
if (width == 0 and height == 0 and	
color == 'red' and emphasis == 'strong' or	
highlight > 100):	
raise ValueError("sorry, you lose")	
if width == 0 and height == 0 and (color == 'red' or	
emphasis is None):	
raise ValueError("I don't think so -- values are %s, %s" %	
(width, height))	
Blob.__init__(self, width, height,	
color, emphasis, highlight)
Blank Lines
空行
• トップレベルの関数定義とクラス定義は空白行2つで
区切る
• クラス内のメソッド定義は空白行1つ
• 論理的なグループを分ける為に空白行を使うことも可能
class foo(object):	
# contents of foo	
!
!
class bar(object):	
# contents of bar
Source File Encoding
ソースファイルのエンコーディング
• Python配布物のコードは常に

Python3はutf8、Python2はASCIIであること
• 基本的には英語で書く
• 詳細はPEP3131 参照
import
インポート1
• import文は1行づつに分けること
• ただしクラス名等をまとめてimportは可能
import os	
import sys	
!
from sabprocess import Popen, PIPE
インポート2
• import文はコードの先頭に書く
• import文は次の順番でグループ化する

1. 標準ライブラリの import

2. サードパーティライブラリのimport

3. ローカルアプリ/ライブラリ独自のimport
• 各importのグループは空白行で区切る
Whitespace in
Expressions and Statements
Pet Peeves
いつもの文句のタネ1
• 以下のような余計なスペースを使わない

- カッコの内側



- カンマ、セミコロン、コロンの手前



- 丸カッコや角カッコの手前
# OK	
spam(ham[1], {eggs: 2})	
# NG	
spam( ham[ 1 ], { eggs: 2 } )
# OK	
if x == 4: print x, y; x, y = y, x	
# NG	
if x == 4 : print x , y ; x , y = y , x
# OK	
dict[‘key’] = spam(list[index])	
# NG	
dict [‘key’] = spam (list [index])
いつもの文句のタネ2
- 他の行と えるために2つ以上のスペース

# OK	
x = 1	
y = 2	
long_variable = 3	
!
#NG	
x = 1	
y = 2	

long_variable = 3
※ この記述方法には賛否両論あり
Other Recommendations
その他の推奨1
• 以下の2項演算子の左右には必ずスペース

代入 (=)・複合代入 (+=, -= etc.)

比較 (==, <, >, !=, <>, <=, >=, in, not in, is, is not)

論理 (and, or, not)
# OK	
a = i + 1	
b = x*2 - y*y	
c = (a+b) * (a-b)	
!
# NG	
a = i+1	
b = x * 2 - y * y	
c = (a + b) * (a - b)
その他の推奨2
• キーワード引数や引数のデフォルト値の場合

=には前後のスペースを入れない
# OK	
def complex(real, imag=0.0):	
return magic(r=real, i=imag)	
!
# NG	
def complex(real, imag = 0.0):	
return magic(r = real, i = imag)
その他の推奨3
• 複数の文を1つの行に書くことは非推奨
• 小さい文であれば許される場合もある
# OK	
if foo == 'blah':	
do_blah_thing()	
do_one()	
do_two()	
do_three()	
!
# Rather not	
if foo == 'blah': do_blah_thing()	
do_one(); do_two(); do_three()	
!
# NG	
do_one(); do_two(); do_three(long, argument,	
list, like, this)
Comments
コメント
• コードと矛盾しているコメントはコメントがない
よりも悪い。常に最新に保つ
• コメントが文の場合、最初の文字は大文字にする
• 英語を書く場合「The Elements of Style」に従う
• 120% 他言語圏の人がコードを読まないと確信が

無い限り英語でコメントを書く
Block Comments
ブロックコメント
• ブロックコメントは同じレベルのインデントの
コードに対するコメント
• ブロックコメントは#と1つのスペースで始まる
Inlines Commnets
インラインコメント
• インラインコメントはコードと同じ行に書かれる
コメント
• コードとインラインコメントの間は少なくとも

2つのスペースで区切り、インラインコメントは

#と1つのスペースで始まる
Documentation Strings
ドキュメント文字列
• 良いドキュメント文字列(docstring)の書き方は

PEP257に書かれている
• 全てのモジュール、クラス、関数、メソッドに書く
• 末尾につく”""は独立した行として書き、空白行を

末尾の前に入れるのは推奨される
• 1行のscstringは、末尾の"""を同じ行に書ける
まとめ
まとめ
• 読みやすいコードを書きましょう
• たまにはPEPを読んでみると面白い
• ただし、英語力がいる
• Python東海の発表で初めてPythonのコードを発
表した
参考URL
• http://www.tdoc.info/PEP-ja/
• https://dl.dropboxusercontent.com/u/555254/
pep-0008.ja.html
• http://www.lifewithpython.com/2013/01/pep-8-style-guide-
for-python-code.html
• http://legacy.python.org/dev/peps/pep-0008/
• http://sphinx-users.jp/articles/pep1.html
最後に
• 意訳、端折った文・内容が多々があります。
• PEP8にはバージョン管理と命名規則がありますが
端折りました。
• 間違ってたらごめんなさい。
• azusaテンプレートを使いました。

http://memo.sanographix.net/post/82160791768
おまけ

PEP8を読んでみよう