1266

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

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

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

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

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

10 に答える 10

1425

ラインは何ですか?問題なく次の行に引数を指定できます。

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

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

if (a == True and
    b == False):

または明示的な改行で:

if a == True and \
   b == False:

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

括弧を使用すると、例を複数の行にまたがって記述できます。

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

明示的な改行を使用して同じ効果を得ることができます。

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

スタイル ガイドでは、括弧を使用した暗黙の継続を使用することが推奨されると記載されていますが、この特定のケースでは、式を単に括弧で囲むのはおそらく間違った方法です。

于 2008-09-09T23:52:05.643 に答える
272

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

もう1つのそのようなケースは、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)file_2.write(file_1.read())

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

二項演算子が演算子を垂直に整列させる前にドナルド・クヌースが壊すスタイル。これにより、加算および減算する項目を決定する際の目の負担が軽減されます。

PEP8から:項演算子の前または後に改行する必要がありますか?

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

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

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

Pythonコードでは、規則がローカルで一貫している限り、二項演算子の前後で中断することができます。新しいコードについては、Knuthのスタイルが提案されています。

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

于 2008-09-10T00:06:39.900 に答える
81

行末にバックスラッシュを使用する場合の危険性は、バックスラッシュの後に空白が追加された場合 (もちろん、これを確認するのは非常に困難です)、バックスラッシュが意図したとおりに機能しなくなることです。

詳細については、Python Idioms および Anti-Idioms (for Python 2またはPython 3 ) を参照してください。

于 2008-09-15T06:28:30.237 に答える
33

\行末にaを付けるか、ステートメントを括弧で囲みます( .. )IBMから:

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

また

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)
于 2008-09-09T23:48:30.740 に答える
28

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

x = (tuples_first_value,
     second_value)
y = 1 + \
    2
于 2008-09-21T12:20:08.193 に答える
24

馬の口から:明示的な線の結合

次のように、 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

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

于 2008-09-09T23:53:17.153 に答える
14

リテラル文字列が長いために行を分割したい場合は、その文字列を細かく分割できます。

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

に置き換えられます

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

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

a very long string

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

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

s = (
  '''2+2='''
  f"{2+2}"
)
于 2020-03-25T07:57:38.280 に答える
7

メソッドの呼び出し ( obj.method()) を複数行で分割することもできます。

コマンドを括弧 " ()" で囲み、複数行にまたがります。

> res = (some_object
         .apply(args)
         .filter()
         .values)

たとえば、Pandas/Holoviews オブジェクト メソッドを呼び出すチェーンで役立つことがわかりました。

于 2020-11-12T22:31:45.720 に答える
6

Pythonic の方法ではないかもしれませんが、私は通常、SQL クエリのように長い文字列を書き込むために join 関数を使用してリストを使用します。

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])
于 2018-11-02T11:22:00.137 に答える