PEP8を読んでみよう

2,231 views
1,931 views

Published on

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

Published in: Software
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,231
On SlideShare
0
From Embeds
0
Number of Embeds
329
Actions
Shares
0
Downloads
9
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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. おまけ

×