webentwicklung-frage-antwort-db.com.de

Wie schreibt man einen sehr langen String, der mit PEP8 übereinstimmt und E501 verhindert?

Da PEP8 vorschlägt, die 80-Spalten-Regel für Ihr Python-Programm zu unterschreiten, wie kann ich dies mit langen Zeichenfolgen tun, d.

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

Wie würde ich dies auf die folgende Zeile erweitern, d.h.

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

Implizite Verkettung kann die sauberste Lösung sein:

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

Bearbeiten Nach dem Nachdenken stimme ich zu, dass Todd 'Vorschlag, Klammern anstelle von Zeilenfortsetzung zu verwenden, aus allen Gründen, die er angibt, besser ist. Ich zögere nur, dass es relativ einfach ist, geklammerte Saiten mit Tupeln zu verwechseln.

88
Michael Dunn

Da benachbarte String-Konstanten automatisch verkettet werden, können Sie sie auch folgendermaßen codieren:

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

Beachten Sie kein Pluszeichen, und ich habe das zusätzliche Komma und Leerzeichen hinzugefügt, das der Formatierung Ihres Beispiels folgt.

Ich persönlich mag die Backslashes nicht, und ich erinnere mich, dass ich irgendwo gelesen habe, dass seine Verwendung zugunsten dieser expliziteren Form abgelehnt wird. Denken Sie daran "Explizite sind besser als implizit."

Ich halte den Backslash für weniger klar und weniger nützlich, da dies dem Zeilenumbruch-Charakter entgeht. Es ist nicht möglich, einen Zeilenende-Kommentar einzugeben, falls dies erforderlich sein sollte. Dies ist mit verketteten String-Konstanten möglich:

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

Ich habe eine Google-Suche nach "Python-Zeilenlänge" verwendet, die den PEP8-Link als erstes Ergebnis zurückgibt, aber auch Links zu einem anderen guten StackOverflow-Post zu diesem Thema: " Warum sollte Python PEP-8 eine maximale Zeilenlänge von 79 Zeichen angeben ? "

Eine weitere gute Suchphrase wäre "Python-Zeilenfortsetzung".

231
Todd

Sie haben ein Leerzeichen verloren und benötigen wahrscheinlich ein Zeilenfortsetzungszeichen, z. a \.

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

oder auch:

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

Parens würde auch anstelle der Zeilenfortsetzung funktionieren, aber Sie riskieren jemanden, der denkt, Sie wollten ein Tupel haben und haben gerade ein Komma vergessen. Nimm zum Beispiel:

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

gegen:

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

Mit der dynamischen Eingabe von Python kann der Code in beide Richtungen ausgeführt werden, führt jedoch zu falschen Ergebnissen mit dem Code, den Sie nicht beabsichtigt haben.

13
retracile

Ich denke, das wichtigste Wort in Ihrer Frage war "schlägt" vor. 

Codierstandards sind lustige Dinge. Oft ist die Anleitung, die sie geben, eine wirklich gute Grundlage, wenn sie geschrieben wurde (z. B. können die meisten Terminals nicht mehr als 80 Zeichen in einer Zeile anzeigen), aber im Laufe der Zeit werden sie funktional veraltet, werden jedoch weiterhin strikt eingehalten. Ich denke, Sie müssen hier die relativen Vorzüge des "Brechens" dieses speziellen Vorschlags gegen die Lesbarkeit und Haltbarkeit Ihres Codes abwägen.

Entschuldigung, das beantwortet Ihre Frage nicht direkt.

12
ZombieSheep

Backslash:

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

oder in parens einwickeln:

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

Mit einem \ können Sie Anweisungen auf mehrere Zeilen erweitern:

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

sollte arbeiten.

1
Ikke

Ich neige dazu, einige Methoden zu verwenden, die hier nicht erwähnt werden, um große Zeichenfolgen anzugeben, aber diese beziehen sich auf sehr spezifische Szenarien. YMMV ...

  • Mehrzeilige Textfelder, oft mit formatierten Token (nicht ganz das, was Sie wollten, aber immer noch nützlich):

    error_message = '''
    I generally like to see how my helpful, sometimes multi-line error
    messages will look against the left border.
    '''.strip()
    
  • Wachsen Sie die Variable Stück für Stück durch die von Ihnen bevorzugte String-Interpolationsmethode auf:

    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.'
    
  • Lesen Sie es aus einer Datei. PEP-8 beschränkt die Länge von Zeichenfolgen in einer Datei nicht. nur die Zeilen Ihres Codes. :)

  • Verwenden Sie brute-force oder Ihren Editor, um die Zeichenfolge mithilfe von Zeilenumbrüchen in Managaeble-Linien aufzuteilen, und entfernen Sie dann alle Zeilenumbrüche. (Ähnlich wie bei der ersten Technik, die ich aufgeführt habe):

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

Verfügbare Optionen:

  • Backslash: "foo" \ "bar"
  • Pluszeichen gefolgt von Backslash: "foo" + \ "bar"
  • Klammern:
    • ("foo" "bar")
    • Klammern mit Pluszeichen: ("foo" + "bar")
    • PEP8, E502: Der Backslash ist in Klammern redundant

Vermeiden

Vermeiden Sie Klammern mit Komma: ("foo", "bar"), das ein Tupel definiert.


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

Ich habe in der Vergangenheit textwrap.dedent verwendet. Es ist ein wenig umständlich, deshalb ziehe ich jetzt Zeilenumbrüche vor, aber wenn Sie wirklich den Blockeinzug wünschen, finde ich das großartig. 

Beispielcode (wobei der Beschnitt das erste '\ n' mit einem Slice entfernen soll):

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

Erläuterung: 

Soweit ich das beurteilen kann, berechnet dedent den Einzug anhand des Leerraums in der ersten Textzeile vor einer neuen Zeile. Also habe ich eine neue Zeile hinzugefügt, um den Code einfach aufzustellen. Um die neue Zeile zu vermeiden, müssen Sie der ersten Textzeile zusätzliche Leerzeichen hinzufügen, damit die Einrückung der nachfolgenden Zeilen nach Wunsch reduziert wird. Wenn Sie es optimieren wollten, können Sie es mit dem Modul re leicht erneut implementieren.

Diese Methode hat Einschränkungen dahingehend, dass sehr lange Zeilen immer noch länger sind als Sie möchten. In diesem Fall sind andere Methoden, die Zeichenfolgen verketten, besser geeignet.

0
MrMas

Dies sind alles gute Antworten, aber ich konnte kein Editor-Plugin finden, das mir beim Bearbeiten von "implizit verketteten" Zeichenfolgen helfen würde. Deshalb habe ich ein Paket geschrieben, um es mir zu erleichtern.

On Pip (Absätze installieren), wenn jemand, der diesen alten Thread durchstreift, es ausprobieren möchte. Formatiert mehrzeilige Zeichenfolgen wie in HTML (Leerzeichen komprimieren, zwei neue Zeilen für einen neuen Absatz, keine Sorge um Leerzeichen zwischen den Zeilen).

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."""
)

wird ...

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...

Alles passt gut zu (Vim) 'gq'

0
Shay