web-dev-qa-db-ja.com

Pythonでこの長い行を分割するにはどうすればよいですか?

このような長い行をどのようにフォーマットしますか? 80文字以内に収めたい:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

これが私の最善の選択肢ですか?

url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))
140
Gattster

それが始まりです。長い文字列を使用するコードの外部で定義することは悪い習慣ではありません。これは、データと動作を分離する方法です。最初のオプションは、文字列リテラルを互いに隣接させることで暗黙的に結合することです。

("This is the first line of my text, "
"which will be joined to a second.")

または、行末の継続では、これが機能するため、少し壊れやすくなります:

"This is the first line of my text, " \
"which will be joined to a second."

しかし、これはそうではありません:

"This is the first line of my text, " \ 
"which will be joined to a second."

違いを見ます?いや?まあ、それはあなたのコードでもありません。

暗黙的な結合の欠点は、文字列リテラルでのみ機能し、変数から取得した文字列では機能しないため、リファクタリングすると少し複雑になります。また、結合された文字列全体の書式設定のみを補間できます。

または、連結演算子(+)を使用して明示的に結合できます。

("This is the first line of my text, " + 
"which will be joined to a second.")

pythonのzenが示すように、明示的は暗黙的よりも優れていますが、これは1つではなく3つの文字列を作成し、2倍のメモリを使用します。彼らは一緒に参加したので、禅をいつ無視するかを知る必要があります。利点は、各行の部分文字列に個別に、または括弧の外側からロット全体に書式設定を適用できることです。

最後に、三重引用符で囲まれた文字列を使用できます。

"""This is the first line of my text
which will be joined to a second."""

これはしばしば私のお気に入りですが、改行と後続の行の先頭の空白が最終的な文字列に表示されるため、その動作はわずかに異なります。バックスラッシュをエスケープすると、改行を削除できます。

"""This is the first line of my text \
which will be joined to a second."""

これには、上記の同じ手法と同じ問題があります。正しいコードは、不可視の空白によって誤ったコードとのみ異なるという点です。

どれが「最良」であるかは、あなたの特定の状況に依存しますが、答えは単に美的なものではなく、微妙に異なる行動の一つです。

279
jcdyer

連続する文字列リテラルはコンパイラによって結合され、括弧で囲まれた式はコードの1行と見なされます。

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))

個人的には、オープンブロックをぶら下げるのは嫌いなので、次のようにフォーマットします。

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

一般に、コードを80列の行に正確に収めるのに苦労することはありません。行の長さを妥当なレベルに抑える価値はありますが、80の厳しい制限は過去のものです。

10
bobince

Textwrapモジュールを使用して、複数行に分割できます

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

ドキュメント から:

textwrap。wrap(text [、width [、...]])
単一の段落をテキスト(文字列)でラップして、すべての行が最大でwidth文字の長さになるようにします。最終改行なしで、出力行のリストを返します。

オプションのキーワード引数は、以下で説明する TextWrapper のインスタンス属性に対応します。幅のデフォルトは70です。

Wrap()の動作の詳細については、 TextWrapper.wrap() メソッドを参照してください。

3
Saurabh

長い文字列で.format()を呼び出しようとしていて、その後の.format(呼び出しを中断せずに最も一般的な文字列ラッピングテクニックを使用できない場合は、str.format("", 1, 2)を実行できます。 "".format(1, 2)の代わりに。これにより、好きなテクニックで文字列を分割できます。例えば:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

することができます

logger.info(str.format(("Skipping {0} because its thumbnail was already"
+ "in our system as {1}"), line[indexes['url']], video.title))

そうでなければ、唯一の可能性は、行末の継続を使用することですが、私は個人的には好きではありません。

0
Simon Alford