56

一部の行の長さが 80 文字を超える Python をいくつか作成しました。これは、私が維持する必要があるしきい値です。コードを調整して行の長さを減らすにはどうすればよいですか?

4

4 に答える 4

60

私の現在のエディター (Kate) は、行の長さが 80 文字以上になると単語の境界に改行を導入するように構成されています。これにより、境界を超えたことがすぐに明らかになります。さらに、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 文字を指定しています。80 文字を使用している場合は、すでにそれを超えています。

于 2010-01-15T10:14:55.090 に答える
21

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')

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

mydict = {
    'key': 'value',
    'yes': 'no'
}
于 2010-01-15T10:09:08.763 に答える
19

前の回答に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!")

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

Devinの答えに関連する少しの注意点:「括弧」構文は実際には「普遍的に機能」しません。たとえば、d [42]="H22G"は次のように書くことはできません。

(d
 [42] = "H2G2")

かっこは「計算された」式の前後でのみ使用できるためです(これには、上記のような割り当て(=)は含まれません)。

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

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

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

このような場合は、「\」構文を使用するか、(可能であれば「\」を避ける必要があるため)コードを複数のステートメントに分割することをお勧めします。

于 2010-01-15T13:04:50.903 に答える
18

慣用的な 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()

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

于 2010-01-15T10:23:48.780 に答える