Wie zusätzliche Vertiefung von Python triple zitierte mehrzeiligen Strings entfernen?

StackOverflow https://stackoverflow.com/questions/1412374

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe einen Python-Editor, in dem der Benutzer ein Skript oder einen Code eingeben, der dann in ein Hauptverfahren hinter den Kulissen gelegt wird, während auch jede Zeile eingerückt ist. Das Problem ist, dass, wenn ein Benutzer eine mehrzeilige Zeichenfolge hat, machte die Vertiefung für das gesamte Skript wirkt sich auf die Zeichenfolge, durch eine Lasche in jedem Raum eingesetzt wird. Ein Problem Skript wäre etwas so einfach wie:

"""foo
bar
foo2"""

Also, wenn im Hauptverfahren würde es wie folgt aussehen:

def main():
    """foo
    bar
    foo2"""

und die Zeichenfolge würde jetzt eine zusätzliche Registerkarte am Anfang jeder Zeile hat.

War es hilfreich?

Lösung

Also, wenn ich es richtig zu erhalten, nehmen Sie was auch immer die Benutzereingaben, einrücken es richtig und fügen Sie es dem Rest des Programms (und dann das ganze Programm ausgeführt wird).

So, nachdem Sie die Benutzereingabe in das Programm setzen, könnten Sie eine Regex laufen, das dauert im Grunde, dass Zwang Einbuchtung zurück. Etwas wie:. Innerhalb von drei Kursen, ersetzen Sie alle „neuen Linienmarkierungen“, gefolgt von vier Leerzeichen (oder eine Registerkarte) mit nur einer „neuen Linienmarkierung“

Andere Tipps

textwrap.dedent aus der Standardbibliothek ist es automatisch rückgängig zu machen die verrückte Einbuchtung.

Von dem, was ich sehe, eine bessere Antwort hier könnte inspect.cleandoc werden, die funktionell tut, was textwrap.dedent tut, sondern behebt auch die Probleme, die mit der führenden Linie textwrap.dedent hat. Das folgende Beispiel zeigt die Unterschiede:

   >>> import textwrap
   >>> import inspect
   >>> x = """foo bar
       baz
       foobar
       foobaz
       """
   >>> inspect.cleandoc(x)
   'foo bar\nbaz\nfoobar\nfoobaz'
   >>> textwrap.dedent(x)
   'foo bar\n    baz\n    foobar\n    foobaz\n'
   >>> y = """
   ...     foo
   ...     bar
   ... """
   >>> textwrap.dedent(y)
   '\nfoo\nbar\n'
   >>> inspect.cleandoc(y)
   'foo\nbar'

Was die erste Zeile einer mehrzeiligen Zeichenfolge folgt, ist Teil der Zeichenfolge und nicht als Einschnitt durch den Parser behandelt. Sie können frei schreiben:

def main():
    """foo
bar
foo2"""
    pass

, und es wird das Richtige tun.

Auf der anderen Seite, das ist nicht lesbar, und Python weiß es. Wenn also ein docstring Leerzeichen enthält in seinen zweiten Linie, die Menge von Leerzeichen wird abgezogen, wenn Sie help() verwenden, um das docstring anzuzeigen. So help(main) und die folgende help(main2) der gleichen Hilfeinformationen erzeugen.

def main2():
    """foo
    bar
    foo2"""
    pass

Der einzige Weg, i sehen - ist ersten n Laschen für jede Zeile mit dem zweiten Ausgangs abzustreifen, wobei n identation der Hauptverfahren bekannt ist.

Wenn das identation nicht im Voraus bekannt ist - Sie hinzufügen können Newline Hinter, bevor sie und Streifen Anzahl der Registerkarten aus der letzten Zeile eingefügt ...

Die dritte Lösung ist, Daten zu analysieren und zu Beginn des mehrzeiligen Angebots finden und fügen Sie nicht Ihre identation nach zu jeder Zeile, bis es geschlossen wird.

Denken gibt es eine bessere Lösung ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top