高品質コードの作成--pythonプログラムの改善の提案(一)

5041 ワード

原文は私のブログのホームページに発表して、転載して出典を明記してください!
初志
pythonは入門が容易なプログラミング言語ですが、pythonを書くのは容易ではありません.pythonを専門に使う人でなければ、pythonをスクリプト言語としたり、データを処理したりするだけで、基本的な文法を身につけてから、進歩を求めません.しかし、pythonを勉強している人はみなpythonicという単語を知っていると信じています.この言葉は定義しにくく、心から理解していますが、Tim Petersの「The Zen of Python」のいくつかの点を認めています.
  • 美勝丑、顕勝隠、簡勝雑、雑勝乱、平勝急、疎勝密
  • 簡単な問題を見つける一つの方法は、唯一の方法であることが望ましい
  • 説明しにくい実装は、悪いアイデアから生じる
  • pythonを使うのはもう長い間、自分が上昇のボトルネックにあることに気づいて、私は読書がこのような問題を解決する不二法門だと信じて、だからいくつかの読書ノートを書いて、もちろん本の中のいくつかの内容は私は苟同する勇気がなくて、だから自分の選別と考えにも参加します.
    提案1:pythonicコードを書く
  • コードスタイルいくつかの一般的な例を挙げると、2つの変数交換:
    a, b = b, a
    コンテナを巡る:
    for i in container:
    do_sth_with(i)
    安全な処理ファイル:
    with open(path,"r") as f:
    do_sth_with(f)
  • 標準ライブラリ書くpythonicは標準ライブラリに対して十分な理解が必要で、特に内蔵関数と内蔵データ型、例えば文字列フォーマットに対して、一般的に書くのはこのようにします:
    print 'Hello %s!' % ('Tom',)
    このように非常に可読性に影響して、数量が多くなった後、どのプレースホルダがどのパラメータに対応するかを明らかにするのは難しいです.
    print 'Hello %(name)s!' % {'name':'Tom'}
    と書いたほうがいいです.これはかなりpythonicですが、%プレースホルダを考えると、C言語を勉強するときから頭に深く根ざしています.pythonには、もっとpythonicの書き方もあります.
    print '{greet} from {language}.'.format(greet = 'Hello world', language = 'Python')
    str.format()はpythonが最も推奨する文字列フォーマット方法と呼ばれる文の意図を非常に明確に示している.
  • pythonicのライブラリまたはフレームワークパッケージとモジュールのコマンドは、小文字、単数の形式を採用し、短い.パッケージは通常、空の__のみを含むようなネーミングスペースとしてのみ使用されます.init__.pyファイル.

  • 提案2:pythonとC言語の違いを理解する
  • 「インデント」と「{}」
  • 'と「
  • 三元オペレータ"?:"
    python:  X if X<Y else Y
    C:  X<Y:X:Y
  • swith...case

  • 上記の違いはpythonを使ったことがある人なら誰でも知っていると信じているので、余計なことは言わない
    提案3:コードにコメントpythonを適切に追加するには、ブロックコメント、行コメント、ドキュメントコメントの3つの形式のコードコメントがあります.
  • ブロック注釈または行注釈を使用する場合、どのような複雑な操作、アルゴリズムを注釈するか、あるいは理解しにくいか、一目瞭然なコード
  • を注釈するだけではない.
  • は、簡単かどうかにかかわらず、外部からアクセス可能な関数およびメソッドにドキュメントコメントを追加します.注釈方法の機能を明確に記述し、パラメータ、戻り値、および発生する可能性のある異常を説明し、外部から呼び出されたユーザがドキュメントの注釈を見るだけで正しく使用できるようにします.複雑な内部メソッドにもコメントが必要です.推奨される関数注釈は、
    def FuncName(parameter1, parameter2):
    """
    Describe what this function does:
     #such as "Find whether the special string is in the queue or not"
    Args:
        parameter1:parameter type, what is this parameter used for
        parameter2:parameter type, what is this parameter used for
    Returns:
        return type, return value
    """
        function body
        ···
        ···
  • です.
  • ヘッダファイルにはcopyright宣言、モジュール記述などが含まれており、必要に応じて作成者情報の追加や変更記録の追加が考えられる.
  • """
        Licensed Materials - Property of CorpA
        (C) Copyright A Corp. 1999, 2011 All Rights Reserved
        Copyright statement and purpose... 
    --------------------------------------------------------
    File name   :
    Description :
    
    Author:
    Change Activity:
    --------------------------------------------------------
    """

    提案4:空の行を適切に追加することで、コードレイアウトをより優雅で合理的にする
  • は、コードのセットが完全な思想を表現した後、空白行で間隔を置くべきである.たとえば、各関数間で宣言、変数割り当てなどをインポートします.関数定義またはクラス定義の間に2行空けたり、クラス定義と最初のメソッドの間に1行空けたり、意味分割が必要な場所に1行空けたりすることをお勧めします.
  • コンテキストの意味の理解性をできるだけ維持し、1つの関数が別の関数を呼び出す必要がある場合、できるだけ一緒に置いて、呼び出し者が上にいて、呼び出し者が下にいることが望ましい.
  • は、長すぎるコード行を避け、各行80文字を超えないことが望ましい.
  • スペースの使用は、強調が必要なときに警告して読むことができ、関係を緩和するエンティティ間で区切りの役割を果たし、緊密な関係を持つときはスペースを使用しないでください.具体的には、
  • 二元演算子(賦値(=),比較(=,<,>,!=,<>,<>,<=,>=,in,not in,is,is not),ブール演算(and,or,not))の左右にスペース
  • があるはずです
  • カンマとセミコロンの前にスペース
  • を使用しないでください.
  • 関数名と左かっこの間、シーケンスインデックス操作時のシーケンス名と[]の間にスペースは必要ありません.関数のデフォルトパラメータの両側にはスペース
  • は必要ありません.
  • 前のオペレータを強調するときにスペースを使用します.

  • 提案5:関数を記述する4つの原則*
  • 関数の設計はできるだけ短くしなければならない
  • 関数宣言は、
  • を合理的で簡単で使いやすいようにします.
  • 関数パラメータ設計は、
  • と下位互換性を考慮すべきである.
  • 1 1つの関数は1つのことだけをして、できるだけ関数文の粒度の一致性
  • を保証します.
    提案6:定数を1つのファイルに集中してpythonで定数をどのように使用するか、一般的には2つの方法があります.
  • は、変数が表す意味が定数であることをネーミングスタイルによってユーザに注意する.TOTAL,MAX_OVERFLOW、しかしこの方式は本当の定数を実現していないで、その対応する値は依然として変えることができて、これはただ1種の約束の俗成の風格
  • です
  • は、カスタムクラスによって定数機能を実現します.これは、「すべて大文字で命名」と「値がバインドされると変更できない」の2つの条件を満たす必要があります.この問題は異常によって解決できる
    class _const:
        class ConstError(TypeError): pass
        class ConstCaseError(ConstError): pass
        
        def __setattr__(self, name, value):
            if self.__dict__.has_key(name):
                raise self.ConstError, "Can't change const. %s" %name
            if not name.isupper():
                raise self.ConstCaseError, \
                    'const name "%s" is not all uppercase' %name
            self.__dict__[name] = value
    
    import sys
    sys.modules[__name__] = _const()

    定数定義を制約するクラスが定義されています.定数の定義方法は次のとおりです(すべての定数を1つのファイルconstant.pyに定義することをお勧めします).
    import const
    const.COMPANY = "IBM"
    ...

    これらの定数を他のモジュールで参照する場合は、次のようにします.
    from constant import const
    print const.COMPANY

    まとめ:このブログでは、pythonだけでなく、他のプログラミング言語でも同様に適用できる一般的なプログラミングガイドラインをいくつか挙げています.
    参考:高品質コードの作成--pythonプログラムを改善する91の提案