2016-09-12 19 views
5

複数のパラメータとタイプヒントを持つメソッドのハンギングインデントの正しい構文は何ですか?Pythonでヒントをタイプしてインデントを挟むためのインデントの適切なレベルは何ですか?

def get_library_book(
    self, 
    book_id: str, 
    library_id: str 
) -> Book: 

PEP8の下に、最初のパラメータの下で

合わせ

def get_library_book(self, 
        book_id: str, 
        library_id: str 
        )-> Book: 

インデント1つのレベルはインデント1レベルの下ケースをサポートしていますが、指定されていない最初の下揃える場合パラメータが許可されます。それは状態を示します:

ぶら下げインデントを使用する場合は、次の点を考慮する必要があります。 は、最初の行に引数を指定しないでください。また、継続行として明確に区別するために、インデント を使用する必要があります。

答えて

2

PEP8には多くの良いアイデアがありますが、ホワイトスペースに関するこの種の質問を決めるのに頼ることはありません。私がPEP8の推奨事項を空白で勉強したとき、私はそれらが矛盾していて矛盾していることがわかりました。

代わりに、Pythonだけでなく、ほぼすべてのプログラミング言語に適用される一般原則を検討します。

最初の例に示す列の配置には多くの欠点があります。私は自分のプロジェクトでこれを使用したり、許可したりしません。

欠点のいくつか

  • その長さが異なっているので、あなたは、関数名を変更する場合は、すべてのパラメータを再調整しなければなりません。
  • この再配置を実行すると、ソースコントロールの差分は不要な空白の変更で煩雑になります。
  • コードが更新され、管理されているので、変数の名前を変更するときに整列の一部が失われ、コードが整列しなくなる可能性があります。
  • 長さがかなり長くなります。
  • アライメントは比例フォントでは機能しません。 (はい、いくつかの開発者は、プロポーショナルフォントを好む、とあなたは列の配置を避ける場合は、あなたのコードは等幅かプロポーショナルフォントで均等に読めるとなります。)

あなたがより複雑な場合に列の配置を使用している場合はそれも悪くなります。

これは、コーディングスタイルがこのような列の配置を要求するServoブラウザの錆コードです。 Pythonコードではありませんが、まったく同じ原則がPythonやほぼすべての言語に適用されます。

このコードサンプルでは、​​列の配置を使用すると悪い状況になることは明らかです。その中で別の関数を呼び出す必要があった場合、または変数名が長い場合は、rewrite_chain_expr呼び出しをネストします。 非常に長い行が必要な場合を除き、ちょうど部屋外です。

は、2番目のPythonの例のように純粋にインデントベースのスタイルを使用してこれらのバージョンのいずれかで上記の比較:

let mut rewrites = try_opt!(
    subexpr_list 
     .iter() 
     .rev() 
     .map(|e| { 
      rewrite_chain_expr(e, total_span, context, max_width, indent) 
     }) 
     .collect::<Option<Vec<_>>>() 
); 

あるいは、rewrite_chain_exprにパラメータが長かった場合またはあなただけの短い行を望んでいたとします。列整列スタイルとは対照的に

let mut rewrites = try_opt!(
    subexpr_list 
     .iter() 
     .rev() 
     .map(|e| { 
      rewrite_chain_expr(
       e, 
       total_span, 
       context, 
       max_width, 
       indent 
      ) 
     }) 
     .collect::<Option<Vec<_>>>() 
); 

、この純粋なインデントスタイルは、多くの利点と全く欠点があります。

2

PEP 8の前の行を、「ぶら下がりインデント」の前の部分より慎重に読んでください。

継続行は、垂直括弧、大括弧および括弧の内側接合Pythonの暗黙のラインを使用して、またはぶら下げインデントを使用してのいずれかでラップされた要素を整列させるべきです。これは、最初に「はいの例、および上記のあなたの最初の例をカバーすることを意図している

# Aligned with opening delimiter. 
foo = long_function_name(var_one, var_two, 
         var_three, var_four) 
2

アパートTerrys答えから、注釈を付けるためのPythonのGitHubの上のプロジェクトであるtypeshedから例を取ります。

:スタブと stdlib例えば

、注釈(あなたが見れば、その他の場合は)importlib.machineryでは、あなたの最初のフォーム、for exampleを使用して行われ

def find_module(cls, fullname: str, 
       path: Optional[Sequence[importlib.abc._Path]] 
       ) -> Optional[importlib.abc.Loader]: 
関連する問題