web-dev-qa-db-ja.com

Pythonコードを1行80文字未満にするにはどうすればよいですか?

いくつかの行の長さが80文字を超えるPythonを記述しました。これは、このしきい値を下回る必要があります。行の長さを減らすためにコードを適応させるにはどうすればよいですか?

54
sahana

現在のエディター(Kate)は、行の長さが80文字に達するかそれを超えると、Wordの境界に改行を挿入するように構成されています。これにより、境界を越えたことがすぐにわかります。さらに、80文字の位置を示す赤い線があり、線がいつ流れるかを事前に警告します。これらにより、複数の物理回線に適合する論理回線を計画できます。

実際にそれらを合わせる方法については、いくつかのメカニズムがあります。行を\で終了できますが、これはエラーを起こしやすいです。

# works
print 4 + \
    2

# doesn't work
print 4 + \ 
    2

違い?違いは目に見えません。2番目のケースでは、バックスラッシュの後に空白文字がありました。おっとっと!

代わりに何をすべきですか?さて、括弧で囲んでください。

print (4 + 
    2)

\は必要ありません。これは実際に普遍的に機能し、\は必要ありません。属性アクセス境界でも!

print (foo
    .bar())

文字列の場合、明示的に追加することも、Cスタイルの結合を使用して暗黙的に追加することもできます。

# all of these do exactly the same thing
print ("123"
    "456")
print ("123" + 
    "456")
print "123456"

最後に、特に括弧だけでなく、任意の形式の括弧(()、[]。{})にあるものはどこにでも改行を入れることができます。そのため、たとえば、要素がコンマで区切られている限り、複数行にわたってリストリテラルを使用できます。

これらすべては、Pythonの 公式ドキュメント にあります。また、クイックノート PEP-8 では、80文字ではなく79文字を制限として指定しています。

58

80文字を超えるコードが関数呼び出し(または定義)である場合、引数行を改行します。 Pythonは括弧を認識し、1行として認識します。

function(arg, arg, arg, arg,
         arg, arg, arg...)

80文字を超えるコードが自然に分割できないコード行である場合、バックスラッシュ\を使用して改行を「エスケープ」できます。

some.weird.namespace.thing.that.is.long = ','.join(strings) + \
                                          'another string'

括弧を使用することもできます。

some.weird.namespace.thing.that.is.long = (','.join(strings) +
                                           'another string')

すべてのタイプのセットブラケット{}(dict/set)、[](リスト)、()(タプル)は、問題なく複数の行に分割できます。これにより、より適切な書式設定が可能になります。

mydict = {
    'key': 'value',
    'yes': 'no'
}
22
Tor Valamo

慣用的Python 言います:

最後の手段としてバックスラッシュを使用する

したがって、括弧_()_を使用できる場合は、バックスラッシュを避けてください。 a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines.across.the.whole.trainyard.and.several.states()がある場合は、次のようにします。

_lines = a.train.wreck.that.spans.across.a.dozen.cars.and-multiple.lines
lines.across.the.whole.trainyard.and.several.states()
_

または、できればコードをリファクタリングしてください。お願いします。

18
Kimvais

以前の回答に2つのポイントを追加します。

文字列は自動的に連結できるため、非常に便利です。

this_is_a_long_string = ("lkjlkj lkj lkj mlkj mlkj mlkj mlkj mlkj mlkj "
                         "rest of the string: no string addition is necessary!"
                         " You can do it many times!")

これは効率的であることに注意してください:notを実行すると、コードの実行時に文字列の連結が計算されます:代わりに、これは単一の長い文字列リテラルと直接見なされるため、効率的です。

Devinの答えに関連する小さな警告:「括弧」構文は実際には「普遍的に機能する」わけではありません。たとえば、d [42] = "H22G"は次のように書くことはできません。

(d
 [42] = "H2G2")

括弧は「計算済み」式の周りでのみ使用できるためです(上記のような割り当て(=)は含まれません)。

別の例は、構文エラーを生成する次のコードです。

with (open("..... very long file name .....")
      as input_file):

実際、より一般的には式を括弧で囲むことはできません(式のみ)。

これらの場合、「\」構文を使用するか、可能な場合は「\」を避けるため、コードを複数のステートメントに分割することができます。

18
Eric O Lebigot