Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,	...
インデント2
• カッコによる暗黙の行継続を使っている場合、
縦に えるか「吊り下げインデント」を使う
• 「吊り下げインデント」を使っている場合は
最初の行に引数を置かないこと。
foo = long_function_name(var_on...
インデント3
• 複数行に渡るカッコの閉じカッコはその行の

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

インデントに える
my_list = [	
1, 2, 3,	
4, 5, 6,	
]	
re...
インデント4
# NG 1	
foo = long_function_name(var_one, var_two,	
var_three, var_four)	
!
# NG 2	
def long_function_name(	
var_on...
Tabs or Spaces?
タブかスペースか?
• インデントにはスペースを推奨
• タブを使っていいのは既にタブでインデントさ
れているコードと一貫性を保つ場合のみ
• Python3 ではインデントにタブとスペース

両方使うことを許可しない
• Python2 用の...
Maximum Line Length
行の長さの最大値1
• 全ての行は79文字以内
• docstring やコメントは72文字
• チームで合意が取れれば99文字まで増やしても良い
‘’’	
最大72文字	
!
‘’’	
!
# 最大72文字	
!
def aaa():	
pr...
行の長さの最大値2
• 行が長い場合はカッコでの暗黙的な行継続かバッ
クスラッシュを使って書く
• カッコでの行継続を優先して書く
• with、assertではバックスラッシュを使用する
with open('/path/to/some/fi...
行の長さの最大値3
• 継続行を適切にインデントする
• 2項演算子で改行する場合は演算子の後ろで

改行するのが推奨
class Rectangle(Blob):	
!
def __init__(self, width, height,	
c...
Blank Lines
空行
• トップレベルの関数定義とクラス定義は空白行2つで
区切る
• クラス内のメソッド定義は空白行1つ
• 論理的なグループを分ける為に空白行を使うことも可能
class foo(object):	
# contents of foo	
!...
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
•...
Whitespace in
Expressions and Statements
Pet Peeves
いつもの文句のタネ1
• 以下のような余計なスペースを使わない

- カッコの内側



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



- 丸カッコや角カッコの手前
# OK	
spam(ham[1], {eggs: 2})	
# NG	
spa...
いつもの文句のタネ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, ...
その他の推奨2
• キーワード引数や引数のデフォルト値の場合

=には前後のスペースを入れない
# OK	
def complex(real, imag=0.0):	
return magic(r=real, i=imag)	
!
# NG	
...
その他の推奨3
• 複数の文を1つの行に書くことは非推奨
• 小さい文であれば許される場合もある
# OK	
if foo == 'blah':	
do_blah_thing()	
do_one()	
do_two()	
do_three()	...
Comments
コメント
• コードと矛盾しているコメントはコメントがない
よりも悪い。常に最新に保つ
• コメントが文の場合、最初の文字は大文字にする
• 英語を書く場合「The Elements of Style」に従う
• 120% 他言語圏の人がコード...
Block Comments
ブロックコメント
• ブロックコメントは同じレベルのインデントの
コードに対するコメント
• ブロックコメントは#と1つのスペースで始まる
Inlines Commnets
インラインコメント
• インラインコメントはコードと同じ行に書かれる
コメント
• コードとインラインコメントの間は少なくとも

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

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

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

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

http://memo.sanographi...
おまけ
PEP8を読んでみよう
Upcoming SlideShare
Loading in …5
×

PEP8を読んでみよう

4,945 views

Published on

第24回 Python東海 勉強会 発表資料

Published in: Software
  • Follow the link, new dating source: ❶❶❶ http://bit.ly/2F90ZZC ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ❶❶❶ http://bit.ly/2F90ZZC ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

PEP8を読んでみよう

  1. 1. PEP8 を読んでみよう Python東海 第24回勉強会 2014年5月24日 @2box2bo
  2. 2. 自己紹介 • 名前:坪内 由孝
 @2box2bo
 • ブログ:http://www.zumwalt.info/blog • お仕事:地方えすあいあーのインフラ屋 • 所属:(☝ ՞ਊ ՞)☝ウィーンなユーザー会
 Python東海 • 最近のあれ:榛名は大丈夫です!
 (´;ω;`)ブワッ

  3. 3. PEP
  4. 4. PEP とはなんぞ? • 「Python Enhancement Proposal」の略
 日本語訳すると「Python拡張提案」 • Python コミュニティに情報提供や新機能・
 プロセス・環境等を説明するための設計書 • 技術的な仕様とその機能が必要な論理的な
 理由を提供する
  5. 5. PEP8
  6. 6. PEP8 とはなんぞ? • PEPの8番目 
 タイトルは「Style Guide for Python Code」 • 内容はコーディングスタイルのガイド • 日々、時代にあった物に変わっていく • 自分が所属している組織のコーディングスタイルと 競合したら自組織のコーディングスタイルを優先
  7. 7. "A Foolish Consistency is the Hobgoblin of Little Minds"
  8. 8. 愚かな一貫性は狭い心が化けた ものである • コードは書かれるよりもずっと多く読まれる • スタイルガイドは一貫性のためにある • 一番重要な事は、一貫性を諦める、スタイル ガイドを適用しない タイミングを知る事 • PEP8 に従うために後方互換性を壊すことは絶 対にしない
  9. 9. Code lay-out
  10. 10. Indentation
  11. 11. インデント1 • 1 段階のインデントには 4 つのスペースを使う • 継続行のインデントはその次のインデントと 区別できるようにする def long_function_name( var_one, var_two, var_three, var_four): print(var_one)
  12. 12. インデント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)
  13. 13. インデント3 • 複数行に渡るカッコの閉じカッコはその行の
 最初の空白でない文字のインデントに える • もしくは、その複数行の要素が開始した
 インデントに える my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )
  14. 14. インデント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) 「吊り下げインデント」を使う場合は 最初の行に引数を書いてはいけない 次のインデントと区別できるようにする
  15. 15. Tabs or Spaces?
  16. 16. タブかスペースか? • インデントにはスペースを推奨 • タブを使っていいのは既にタブでインデントさ れているコードと一貫性を保つ場合のみ • Python3 ではインデントにタブとスペース
 両方使うことを許可しない • Python2 用のコードで両方使われている場合は
 スペースのみに変換する
  17. 17. Maximum Line Length
  18. 18. 行の長さの最大値1 • 全ての行は79文字以内 • docstring やコメントは72文字 • チームで合意が取れれば99文字まで増やしても良い ‘’’ 最大72文字 ! ‘’’ ! # 最大72文字 ! def aaa(): print “標準的には79文字、最大99文字”
  19. 19. 行の長さの最大値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())
  20. 20. 行の長さの最大値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)
  21. 21. Blank Lines
  22. 22. 空行 • トップレベルの関数定義とクラス定義は空白行2つで 区切る • クラス内のメソッド定義は空白行1つ • 論理的なグループを分ける為に空白行を使うことも可能 class foo(object): # contents of foo ! ! class bar(object): # contents of bar
  23. 23. Source File Encoding
  24. 24. ソースファイルのエンコーディング • Python配布物のコードは常に
 Python3はutf8、Python2はASCIIであること • 基本的には英語で書く • 詳細はPEP3131 参照
  25. 25. import
  26. 26. インポート1 • import文は1行づつに分けること • ただしクラス名等をまとめてimportは可能 import os import sys ! from sabprocess import Popen, PIPE
  27. 27. インポート2 • import文はコードの先頭に書く • import文は次の順番でグループ化する
 1. 標準ライブラリの import
 2. サードパーティライブラリのimport
 3. ローカルアプリ/ライブラリ独自のimport • 各importのグループは空白行で区切る
  28. 28. Whitespace in Expressions and Statements
  29. 29. Pet Peeves
  30. 30. いつもの文句のタネ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])
  31. 31. いつもの文句のタネ2 - 他の行と えるために2つ以上のスペース
 # OK x = 1 y = 2 long_variable = 3 ! #NG x = 1 y = 2 
long_variable = 3 ※ この記述方法には賛否両論あり
  32. 32. Other Recommendations
  33. 33. その他の推奨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)
  34. 34. その他の推奨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)
  35. 35. その他の推奨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)
  36. 36. Comments
  37. 37. コメント • コードと矛盾しているコメントはコメントがない よりも悪い。常に最新に保つ • コメントが文の場合、最初の文字は大文字にする • 英語を書く場合「The Elements of Style」に従う • 120% 他言語圏の人がコードを読まないと確信が
 無い限り英語でコメントを書く
  38. 38. Block Comments
  39. 39. ブロックコメント • ブロックコメントは同じレベルのインデントの コードに対するコメント • ブロックコメントは#と1つのスペースで始まる
  40. 40. Inlines Commnets
  41. 41. インラインコメント • インラインコメントはコードと同じ行に書かれる コメント • コードとインラインコメントの間は少なくとも
 2つのスペースで区切り、インラインコメントは
 #と1つのスペースで始まる
  42. 42. Documentation Strings
  43. 43. ドキュメント文字列 • 良いドキュメント文字列(docstring)の書き方は
 PEP257に書かれている • 全てのモジュール、クラス、関数、メソッドに書く • 末尾につく”""は独立した行として書き、空白行を
 末尾の前に入れるのは推奨される • 1行のscstringは、末尾の"""を同じ行に書ける
  44. 44. まとめ
  45. 45. まとめ • 読みやすいコードを書きましょう • たまにはPEPを読んでみると面白い • ただし、英語力がいる • Python東海の発表で初めてPythonのコードを発 表した
  46. 46. 参考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
  47. 47. 最後に • 意訳、端折った文・内容が多々があります。 • PEP8にはバージョン管理と命名規則がありますが 端折りました。 • 間違ってたらごめんなさい。 • azusaテンプレートを使いました。
 http://memo.sanographix.net/post/82160791768
  48. 48. おまけ

×