Pythonで改行(改行)するにはどうすればよいですか?


1076

複数行に分割したい長いコード行があります。何を使用し、構文は何ですか?

たとえば、一連の文字列を追加すると、

e = 'a' + 'b' + 'c' + 'd'

次のように2行で記述します。

e = 'a' + 'b' +
    'c' + 'd'

回答:


1212

ラインとは何ですか?あなたは問題なく次の行に引数を持つことができます:

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

それ以外の場合は、次のようなことができます。

if a == True and \
   b == False

詳細については、スタイルガイドを確認してください。

あなたの例の行から:

a = '1' + '2' + '3' + \
    '4' + '5'

または:

a = ('1' + '2' + '3' +
    '4' + '5')

スタイルガイドによると、括弧を使用した暗黙の継続の使用が推奨されていますが、この特定のケースでは、式の周りに括弧を追加するだけではおそらく間違った方法になります。


35
実際には、スタイルガイドの設定は正確に逆です。暗黙的な継続が推奨され、明示的なバックスラッシュは必要な場合にのみ使用されます。
カールマイヤー

35
カール:私は同意しません、これはガイドからです:長い行をラップする好ましい方法は、括弧、角括弧、中括弧内でPythonの暗黙の行継続を使用することです。必要に応じて、式の前後に括弧のペアを追加できますが、バックスラッシュを使用した方が見栄えが良い場合があります。
ジェルブ2008

15
スタイルガイドの引用の重要な部分は、「必要に応じて、式の前後にかっこのペアを追加できますが、バックスラッシュを使用した方が見栄えがよい場合があります。」スタイルガイドは括弧を付けるべきだと言っているのではなく、作者の判断に任せています。
Tony Meyer、

23
これらのコメントが追加されてからPEP-8が変更されたと思われます。長い行をラップするために括弧を追加する必要があることがかなり明確になったためです。
ダニエル

46
PEP8は2010年に実際に変更を行いました。「バックスラッシュを使用する方が見栄えがよくなる」ことがなくなりました。
e100

230

PEP 8から-Pythonコードのスタイルガイド

長い行をラップする好ましい方法は、括弧、角括弧、中括弧内でPythonの暗黙の行継続を使用することです。式を括弧で囲むことにより、長い行を複数の行に分割できます。これらは、行を継続するためにバックスラッシュを使用するよりも優先して使用する必要があります。

バックスラッシュが適切な場合もあります。たとえば、長い、複数のwithステートメントでは暗黙の継続を使用できないため、バックスラッシュを使用できます。

with open('/path/to/some/file/you/want/to/read') as file_1, \
        open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

別のそのようなケースは、assertステートメントを使用する場合です。

継続する行を適切にインデントしてください。二項演算子を回避するのに適した場所は、演算子の前ではなく、演算子のです。いくつかの例:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
                color == 'red' and emphasis == 'strong' or
                highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

PEP8は、 読みやすさを向上させるために数学者とその発行者が使用している(二項演算を壊すため反対の規則をます。

ドナルド・クヌースのブレイキングののスタイル二項演算子が演算子を垂直方向に揃える。これにより、追加および削除される項目を決定する際の目の負担を軽減します。

PEP8から二項演算子の前または後に改行すべきですか?

Donald Knuthは、彼のComputers and Typesettingシリーズの従来の規則を説明しています:「段落内の数式は常に2項演算と関係の後で壊れますが、表示された数式は常に2項演算の前に壊れます」[3]。

数学の伝統に従うと、通常はコードが読みやすくなります。

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Pythonコードでは、規則がローカルで一貫している限り、2項演算子の前または後にブレークできます。新しいコードについては、Knuthのスタイルが推奨されます。

[3]:ドナルド・クヌースのThe TeXBook、195および196ページ


3
注:2010年に推奨事項が変更されました:「長い行は改行できます...式を括弧で囲むことです。これらはバックスラッシュを使用するよりも優先して使用する必要があります...」。すべてのバックスラッシュはコード例から削除されました。
e100 2012年

1
@ e100:上の太字のテキストを読んでください。The preferred way .. is by using Python's implied line continuation inside parenthesesこれはと同じですby wrapping expressions in parentheses。私は例を更新しました
jfs

10
ただし、「バックスラッシュを使用すると見栄えがよくなる」こともあることに注意してください。
e100 2012年


6
2015年に、スタイルガイドが更新され、Donald Knuthによる研究の後に、バイナリ演算子の前にブレークすることを好むようになりました。
J2C 2016

70

バックスラッシュを使用して行を終了する際の危険性は、バックスラッシュの後に空白が追加されると(もちろん、これは非常にわかりにくい)、バックスラッシュが意図したとおりに機能しなくなることです。

詳細については、Pythonイディオムと反イディオム(Python 2またはPython 3の場合)を参照してください。


8
これが、末尾の空白をよりよく表示できるのが良い理由の1つです。つまりset list listchars=trail:·、vimのようなものです。:)
ボー

25

\行の最後にa を置くか、ステートメントを括弧で囲みます( .. )IBMから:

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

または

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)

24

括弧と中括弧の間で改行できます。さらに、バックスラッシュ文字\を行に追加して、明示的に改行することができます。

x = (tuples_first_value,
     second_value)
y = 1 + \
    2

20

馬の口から:明示的なライン結合

次のように、2つ以上の物理行をバックスラッシュ文字(\)を使用して論理行に結合できます。物理行が文字列リテラルまたはコメントの一部ではないバックスラッシュで終了する場合、次のように結合して単一の論理行を形成します、バックスラッシュとそれに続く行末文字を削除します。例えば:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

バックスラッシュで終わる行にはコメントを付けることができません。バックスラッシュはコメントを続けません。バックスラッシュは、文字列リテラル以外のトークンを継続しません(つまり、文字列リテラル以外のトークンは、バックスラッシュを使用して物理的な行に分割できません)。バックスラッシュは、文字列リテラルの外の行の他の場所では無効です。


7
例は一義的なIMOであるため、-1。複合条件文は、代わりに絶対的な括弧を使用できます。これは、より実用的(編集または自動再折り返し)および慣用的です。
u0b34a0f6ae 2009

4

これはPythonの方法ではないかもしれませんが、SQLクエリのように長い文字列を書き込むために、結合関数を含むリストを一般的に使用します。

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])

2

The Hitchhiker's Guide to Python(Line Continuation)からの引用:

コードの論理行が受け入れ可能な制限より長い場合は、それを複数の物理行に分割する必要があります。Pythonインタープリターは、行の最後の文字がバックスラッシュの場合、連続する行を結合します。これはいくつかの場合に役立ちますが、脆弱であるため通常は避けてください。バックスラッシュの後の行末に空白が追加されると、コードが壊れ、予期しない結果になる可能性があります。

より良い解決策は、要素を括弧で囲むことです。行末に閉じられていない括弧を残しておくと、Pythonインタープリターは括弧が閉じられるまで次の行に参加します。同じ動作が中括弧と角括弧にも当てはまります。

ただし、多くの場合、長い論理行を分割する必要があることは、同時に多くのことを実行しようとしていることを示しており、読みやすさを妨げる可能性があります。

そうは言っても、これは一般的な文字列にも適用される複数のインポート(行制限を超える場合、PEP-8で定義)を検討する例です。

from app import (
    app, abort, make_response, redirect, render_template, request, session
)

1

長いリテラル文字列のために行を分割したい場合は、その文字列を分割することができます:

long_string = "a very long string"
print("a very long string")

に置き換えられます

long_string = (
  "a "
  "very "
  "long "
  "string"
)
print(
  "a "
  "very "
  "long "
  "string"
)

両方の印刷ステートメントの出力:

a very long string

影響の括弧に注意してください。

リテラル文字列を分割すると、文字列の一部にのみリテラルプレフィックスを使用できることにも注意してください。

s = (
  "2+2="
  f"{2+2}"
)

0

使用行継続演算子をすなわち「\」

例:

# Ex.1

x = 1
s =  x + x**2/2 + x**3/3 \
       + x**4/4 + x**5/5 \
       + x**6/6 + x**7/7 \
       + x**8/8
print(s)
# 2.7178571428571425


----------


# Ex.2

text = ('Put several strings within parentheses ' \
        'to have them joined together.')
print(text)


----------


# Ex.3

x = 1
s =  x + x**2/2 \
       + x**3/3 \
       + x**4/4 \
       + x**6/6 \
       + x**8/8
print(s)
# 2.3749999999999996
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.