Pythonプログラミングコード仕様(Google Style)

6864 ワード

原文:https://www.jianshu.com/p/8b6c425b65a6
プログラミングの過程で、関数の命名、変数の命名、コードの注釈など、一定の規則に従わなければならない.従わなくてもコードを成功させることができるが、優秀できれいなコードは必ず暗黙的ないくつかの規則に従う.そうすれば、他の人が読むのも楽になる.そうしないと、将来自分でも分からない.問題をタイムリーに発見するために、pythonのIDLEを使用して作成することができます.pycharmなどのツールはPEP 8ルールに従い、コードに存在する問題を自動的に発見し、提示します.
この文書の目次は次のとおりです.
目次
一、簡明な概要
1エンコーディング
2コードフォーマット
2.1インデント
2.2行幅
2.3引用符
2.4空白行
3 import文
4スペース
5改行
二注釈
1ファイルコメント
2つのコメント
3行コメント
4 Docstring
三命名規範
1モジュール
2クラス名
3関数
4変数名
5定数
一、簡明な概要
1エンコーディング
  • 特別な事情がなければ、ファイルはUTF-8コードを使用する
  • 特別な事情がなければ、ファイルヘッダにpython翻訳機の位置情報を入れる必要がある
  • # -*- coding: utf-8 -*-
    #! /usr/bin/env python3

    2コードフォーマット
    2.1インデント
  • 4つのスペースを一括してインデント
  • 2.2行幅
    1行あたりのコードは80文字を超えないようにします(特殊な場合はわずかに80を超えることができますが、最長120を超えてはいけません).理由:
  • side-by-sideのdiffを見るときに役立つ
  • コンソールの下でコードを確認しやすい
  • 長すぎるのは設計に欠陥がある可能性がある
  • 2.3引用符
  • 自然言語は二重引用符"...",例えばエラーメッセージ;多くの場合unicode、使用u" "
  • マシンIDは一重引用符で'...',例えばdictのkey
  • 正規表現原生の二重引用符を使うr"..."
  • 文書文字列(docstring)三重引用符を使用"""......"""
  • 2.4空白行
  • 上位定義の間に2行空けてある、例えば関数またはクラス定義
  • メソッド定義、クラス定義と最初のメソッドの間には、いずれも1行空けるべき
  • class A:
    
        def __init__(self):
            pass
    
        def hello(self):
            pass
    
    
    def main():
        pass   
  • 複数の空行で複数の関連関数を区切ることができる
  • 関数では空行で論理関係のコードを区切ることができる
  • 3 import文
  • import文は行で書くべき
  • #      
    import os
    import sys
    
    #       
    import sys,os
    
    #      
    from subprocess import Popen, PIPE
  • import文absolute importを使うべき
  • #      
    from foo.bar import Bar
    
    #       
    from ..bar import Bar
  • import文はファイルヘッダに、モジュールの説明とdocstringの後、グローバル変数の前に置くべきである.
  • import文は順番に並べて、グループごとに1行ずつ区切る
  • 導入順はpython標準ライブラリ、サードパーティライブラリ、独自ライブラリ
  • import os
    import sys
    
    import msgpack
    import zmq
    
    import foo
  • 他のモジュールのクラス定義をインポートする場合、相対インポートを使用可能
  • from myclass import MyClass
  • ネーミング競合が発生した場合はネーミングスペースが使用可能
  • import bar
    import foo.bar
    
    bar.Bar()
    foo.bar.Bar()

    4スペース
  • 二元演算子の両側にそれぞれ1マスずつ空いている[=,-,+=,==,>,in,is not, and]:
  • #      
    i = i + 1
    submitted += 1
    x = x * 2 - 1
    hypot2 = x * x + y * y
    c = (a + b) * (a - b)
    
    #       
    i=i+1
    submitted +=1
    x = x*2 - 1
    hypot2 = x*x + y*y
    c = (a+b) * (a-b)
  • 関数のパラメータリストで、,その後スペースが必要
  • #      
    def complex(real, imag):
        pass
    
    #       
    def complex(real,imag):
        pass
  • 関数のパラメータリストで、デフォルト値等号の両側にスペースを付けない
  • #      
    def complex(real, imag=0.0):
        pass
    
    #       
    def complex(real, imag = 0.0):
        pass
  • 左かっこの後、右かっこの前に余分なスペースを入れない
  • #      
    spam(ham[1], {eggs: 2})
    
    #       
    spam( ham[1], { eggs : 2 } )
  • 辞書対象の左かっこの前に余分なスペースを入れない
  • #      
    dict['key'] = list[index]
    
    #       
    dict ['key'] = list [index]
  • 代入文の位置合わせに使用しない余分なスペース
  • #      
    x = 1
    y = 2
    long_variable = 3
    
    #       
    x             = 1
    y             = 2
    long_variable = 3

    5改行
    Pythonは括弧内の改行をサポートします.この場合、2つの状況があります.
  • 1 2行目は括弧の先頭にインデント
  • foo = long_function_name(var_one, var_two,
                             var_three, var_four)
  • 2 2行目に4つのスペースをインデントし、括弧から改行する場合に適用する
  • def long_function_name(
            var_one, var_two, var_three,
            var_four):
        print(var_one)

    スラッシュ\改行、二元演算子+.などを使用して行末に表示します.長い文字列もこの方法で改行できます
    session.query(MyTable).\
            filter_by(id=1).\
            one()
    
    print 'Hello, '\
          '%s %s!' %\
          ('Harry', 'Potter')

    複合文は禁止されています.つまり、1行に複数の文が含まれています.
    #      
    do_first()
    do_second()
    do_third()
    
    #       
    do_first();do_second();do_third();
    if/for/while必ず改行:
    #      
    if foo == 'blah':
        do_blah_thing()
    
    #       
    if foo == 'blah': do_blash_thing()

    二注釈
    1ファイルコメント
    ファイルの先頭に、著作権、ライセンス宣言、作成者、日付、バージョンなどの情報を追加できます.
    # **********************************************************
    # * Author        : xxxxxx
    # * Email         : [email protected]
    # * Create time   : 2018-04-22 19:26
    # * Filename      : collect-sys-msg.py
    # * Description   :
    # **********************************************************

    2つのコメント
    「#」番号の後に1つ空け、段落は空白行で区切られます(同様に「#」番号が必要です)
    #    
    #    
    #
    #    
    #    

    3行コメント
    少なくとも2つのスペースと文を分けて、無意味なコメントを使用しないように注意してください.
    #      
    x = x + 1  #         
    
    #       (      )
    x = x + 1 # x 1
  • コードの要所要所(または複雑な箇所)で、コメントが書けるものはなるべくコメントを書く
  • 比較的重要な注釈セグメントは、複数の等号で区切られており、より目立つように重要性が強調されている
  • app = create_app(name, options)
    
    
    # =====================================
    #         get post app     !!!
    # =====================================
    
    
    if __name__ == '__main__':
        app.run()

    4 Docstring
    ドキュメントとしてDocstringは、pythonでオブジェクトの__を通過できるように、モジュールヘッダ、関数、クラスヘッダに一般的に表示されます.doc__オブジェクトはドキュメントを取得します.簡単に言えば、モジュール、関数、クラス、メソッドに現れる最初の文はdocstringで、自動的に属性__になります.doc__,たとえば
    def foo():
      """ This is function foo"""
    

    foo._doc__"This is function foo".
  • Docstringは「」で「先頭と末尾、先頭は改行せず、複数行ある場合は末行は改行しなければならない.以下はGoogleのdocstringスタイルの例
  • """
    This is a groups style docs.
     
    Parameters:
      param1 - this is the first param
      param2 - this is a second param
     
    Returns:
      This is a description of what is returned
     
    Raises:
      KeyError - raises an exception
    """
    

    三命名規範
    1モジュール
  • モジュールはなるべく小文字で命名し、頭文字は小文字のままにし、下線はなるべく使わない(複数単語で数が少ない場合を除く)
  • #       
    import decoder
    import html_parser
    
    #        
    import Decoder

    2クラス名
  • クラス名はキャメルCaseのネーミングスタイル、頭文字は大文字、プライベートクラスは下線で始まる
  • class Farm():
        pass
    
    class AnimalFarm(Farm):
        pass
    
    class _PrivateFarm(Farm):
        pass
  • 関連するクラスと上位関数を同一のモジュールに入れる.Javaのように、クラスやモジュールを制限する必要はありません.

  • 3関数
  • 関数名はすべて小文字で、複数の単語があれば下線で区切る
  • def run():
        pass
    
    def run_with_env():
        pass
  • プライベート関数は、関数の前に下線を引く_
  • class Person():
    
        def _private_func():
            pass

    4変数名
  • 変数名はなるべく小文字にし、複数の単語があれば下線で区切る
  • if __name__ == '__main__':
        count = 0
        school_name = ''

    5定数
  • 定数は全大文字、複数の単語がある場合は下線で区切る
  • MAX_CLIENT = 100
    MAX_CONNECTION = 1000
    CONNECTION_TIMEOUT = 600