web-dev-qa-db-ja.com

PEP8に準拠し、E501を防ぐ非常に長い文字列を記述する方法

PEP8がpythonプログラムの80カラムルールを下回ることを推奨しているように、長い文字列、つまり.

s = "this is my really, really, really, really, really, really, really long string that I'd like to shorten."

これを次の行に拡張するにはどうすればいいですか?.

s = "this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten."
174
Federer

暗黙的な連結が最もク​​リーンなソリューションになる可能性があります。

s = "this is my really, really, really, really, really, really," \
    " really long string that I'd like to shorten."

編集リフレクションについては、トッドが行の継続ではなくブラケットを使用するという提案は、彼が与えるすべての理由で優れていることに同意します。唯一の迷いは、括弧で囲まれた文字列とタプルを混同しやすいことです。

100
Michael Dunn

また、隣接する文字列定数は自動的に連結されるため、次のようにコーディングすることもできます。

s = ("this is my really, really, really, really, really, really, "  
     "really long string that I'd like to shorten.")

プラス記号がないことに注意してください。例の書式設定の後に追加のコンマとスペースを追加しました。

個人的には、バックスラッシュが好きではありません。どこかで、その使用は実際には非推奨であり、より明示的なこの形式を支持していることを思い出します。 「明示的は暗黙的よりも優れている」ことを忘れないでください。

これは実際には改行文字をエスケープしているため、バックスラッシュはあまり明確ではなく有用性が低いと考えています。必要な場合は、行末のコメントを後に付けることはできません。連結された文字列定数を使用してこれを行うことができます。

s = ("this is my really, really, really, really, really, really, " # comments ok
     "really long string that I'd like to shorten.")

最初の結果としてPEP8リンクを返す「python line length」のGoogle検索を使用しましたが、このトピックに関する別の良いStackOverflow投稿へのリンクも使用しました: " Why should Python PEP-8 79文字の最大行長を指定しますか? "

別の適切な検索フレーズは、「python line continuation」です。

259
Todd

あなたの質問で最も重要な言葉は「提案」だったと思います。

コーディング標準は面白いものです。多くの場合、彼らが提供するガイダンスは、書かれた時点で非常に優れた基礎を持っていますが(たとえば、ほとんどの端末は80文字以上を行に表示できません)、時間が経つにつれて機能的に時代遅れになりますが、それでも厳守されます。ここで行う必要があるのは、コードの可読性と保守性に対して特定の提案を「壊す」ことの相対的なメリットを比較検討することです。

申し訳ありませんが、これはあなたの質問に直接答えません。

14
ZombieSheep

スペースを失い、おそらく行継続文字が必要になります。 \

s = "this is my really, really, really, really, really, really" +  \
    " really long string that I'd like to shorten."

あるいは:

s = "this is my really, really, really, really, really, really"  \
    " really long string that I'd like to shorten."

Parensは行の継続の代わりに機能しますが、タプルを作成するつもりでコンマを忘れたと考えている人を危険にさらします。例えば:

s = ("this is my really, really, really, really, really, really"
    " really long string that I'd like to shorten.")

対:

s = ("this is my really, really, really, really, really, really",
    " really long string that I'd like to shorten.")

Pythonの動的型付けを使用すると、コードはどちらの方法でも実行できますが、意図しない結果と誤った結果が生成されます。

13
retracile

バックスラッシュ:

s = "this is my really, really, really, really, really, really" +  \
    "really long string that I'd like to shorten."

または括弧で囲む:

s = ("this is my really, really, really, really, really, really" + 
    "really long string that I'd like to shorten.")
3
recursive

私は大きな文字列を指定するためにここで言及されていないいくつかの方法を使用する傾向がありますが、これらは非常に特定のシナリオのためのものです。 YMMV ...

  • 多くの場合、フォーマットされたトークンを使用した複数行のテキストの塊(要求どおりではありませんが、依然として有用です):

    error_message = '''
    I generally like to see how my helpful, sometimes multi-line error
    messages will look against the left border.
    '''.strip()
    
  • 任意の文字列補間方法を使用して、変数を1つずつ成長させます。

    var = 'This is the start of a very,'
    var = f'{var} very long string which could'
    var = f'{var} contain a ridiculous number'
    var = f'{var} of words.'
    
  • ファイルから読み取ります。 PEP-8は、ファイル内の文字列の長さを制限しません。コードの行だけ。 :)

  • ブルートフォースまたはエディターを使用して、改行を使用して文字列を管理可能な行に分割し、すべての改行を削除します。 (私がリストした最初の手法と同様):

    foo = '''
    agreatbigstringthatyoudonotwanttohaveanyne
    wlinesinbutforsomereasonyouneedtospecifyit
    verbatimintheactualcodejustlikethis
    '''.replace('\n', '')
    
0
Larold

利用可能なオプション:

  • バックスラッシュ"foo" \ "bar"
  • プラス記号に続くバックスラッシュ"foo" + \ "bar"
  • 括弧
    • ("foo" "bar")
    • 括弧 with プラス記号("foo" + "bar")
    • PEP8、E502:バックスラッシュは括弧間で冗長です

避ける

タプルを定義するカンマ:("foo", "bar")で角括弧を避けます。


>>> s = "a" \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = "a" + \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = ("a"
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> s = ("a",
... "b")
>>> type(s)
<class 'Tuple'>
>>> s = ("a" + 
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> 
0
marcanuy

過去にtextwrap.dedentを使用しました。少し面倒なので、今は行の継続を好みますが、もしブロックのインデントが本当に必要なら、これは素晴らしいと思います。

サンプルコード(トリムはスライスで最初の '\ n'を取り除くことです):

import textwrap as tw
x = """
       This is a yet another test.
       This is only a test"""
print(tw.dedent(x[1:]))

説明:

私が知ることができることから、dedentはテキストの最初の行の新しい行の前の空白に基づいてインデントを計算します。そこで、コードを簡単に整列できるように改行を追加しました。改行を回避するには、テキストの最初の行に余分な空白を追加して、後続の行のインデントを必要に応じて減らす必要があります。微調整したい場合は、reモジュールを使用して簡単に再実装できます。

この方法には、非常に長い行が必要以上に長くなるという制限があります。その場合、文字列を連結する他の方法の方が適しています。

0
MrMas

これらはすべてすばらしい答えですが、「暗黙的に連結された」文字列の編集に役立つエディタープラグインを見つけることができなかったので、簡単にするためのパッケージを作成しました。

この古いスレッドをさまよっている人がそれをチェックしたい場合は、pip(段落をインストール)で。 htmlのように複数行の文字列をフォーマットします(空白、新しい段落の2つの改行を圧縮します。行間のスペースについては心配しません)。

from paragraphs import par

class SuddenDeathError(Exception):
    def __init__(self, cause: str) -> None:
        self.cause = cause

    def __str__(self):
par(
    f"""
    Y - e - e - e - es, Lord love you! Why should she die of
    influenza? She come through diphtheria right enough the year
    before. I saw her with my own eyes. Fairly blue with it, she was.They
    all thought she was dead; but my father he kept ladling gin down
    her throat til she came to so sudden that she bit the bowl off the
    spoon. 

    What call would a woman with that strength in her have to die of
    influenze? What become of her new straw hat that should have
    come to me? Somebody pinched it; and what I say is, them as pinched
    it done her in."""
)

になります...

Y - e - e - e - es, Lord love you! Why should she die of influenza? She come through...

What call would a woman with that strength in her have to die of influenza?  What...

すべてが(Vim) 'gq'と簡単に整列します

0
Shay

\を使用すると、ステートメントを複数行に展開できます。

s = "this is my really, really, really, really, really, really" + \
"really long string that I'd like to shorten."

動作するはずです。

0
Ikke