Ich habe eine sehr lange Anfrage. Ich möchte es in Python in mehrere Zeilen aufteilen. Eine Möglichkeit, dies in JavaScript zu tun, besteht darin, mehrere Sätze zu verwenden und sie mit einem +
Operator zu verknüpfen (ich weiß, vielleicht ist dies nicht die effizienteste Methode, aber ich bin nicht wirklich besorgt über die Leistung in dieser Phase, sondern nur über die Lesbarkeit des Codes). . Beispiel:
var long_string = 'some text not important. just garbage to' +
'illustrate my example';
Ich habe versucht, etwas Ähnliches in Python zu tun, aber es hat nicht funktioniert, also habe ich \
die lange Zeichenfolge geteilt. Ich bin mir jedoch nicht sicher, ob dies der einzige / beste / pythonischste Weg ist, dies zu tun. Es sieht unangenehm aus. Aktueller Code:
query = 'SELECT action.descr as "action", '\
'role.id as role_id,'\
'role.descr as role'\
'FROM '\
'public.role_action_def,'\
'public.role,'\
'public.record_def, '\
'public.action'\
'WHERE role.id = role_action_def.role_id AND'\
'record_def.id = role_action_def.def_id AND'\
'action.id = role_action_def.action_id AND'\
'role_action_def.account_id = ' + account_id + ' AND'\
'record_def.account_id=' + account_id + ' AND'\
'def_id=' + def_id
python
string
multiline
multilinestring
Pablo Mescher
quelle
quelle
Antworten:
Sprechen Sie über mehrzeilige Zeichenfolgen? Verwenden Sie einfach dreifache Anführungszeichen, um sie zu starten und zu beenden.
Sie können auch einfache Anführungszeichen verwenden (3 davon natürlich am Anfang und am Ende) und die resultierende Zeichenfolge
s
wie jede andere Zeichenfolge behandeln.HINWEIS : Wie bei jeder Zeichenfolge wird alles zwischen den Anführungszeichen am Anfang und am Ende Teil der Zeichenfolge. In diesem Beispiel wird daher ein führendes Leerzeichen angezeigt (wie in @ root45 angegeben). Diese Zeichenfolge enthält auch Leerzeichen und Zeilenumbrüche.
Dh:
Schließlich kann man in Python auch lange Zeilen wie folgt konstruieren:
was wird nicht enthält keine zusätzlichen Leerzeichen oder Zeilenumbrüche (dies ist ein bewusstes Beispiel zeigt , was die Wirkung Zuschnitte des Überspringens in resultieren):
Es sind keine Kommas erforderlich. Platzieren Sie einfach die zu verbindenden Zeichenfolgen in Klammern und achten Sie darauf, dass alle erforderlichen Leerzeichen und Zeilenumbrüche berücksichtigt werden.
quelle
+
die Verkettung nicht zur Laufzeit mit dem Operator ausgeführt?textwrap.dedent
damit unerwünschte führende Leerzeichen entfernen. docs.python.org/3/library/textwrap.html#textwrap.dedentWenn Sie keine mehrzeilige Zeichenfolge möchten, sondern nur eine lange einzeilige Zeichenfolge, können Sie Klammern verwenden. Stellen Sie nur sicher, dass zwischen den Zeichenfolgensegmenten keine Kommas stehen. Dann handelt es sich um ein Tupel.
In einer SQL-Anweisung wie der, die Sie erstellen, sind auch mehrzeilige Zeichenfolgen in Ordnung. Wenn jedoch das zusätzliche Leerzeichen, das eine mehrzeilige Zeichenfolge enthalten würde, ein Problem darstellen würde, wäre dies ein guter Weg, um das zu erreichen, was Sie möchten.
quelle
,
'
?.format(...)
nach der schließenden Klammer hinzuzufügen .%
Das Formatieren der Notation muss auch funktionieren, aber ich habe es nicht versucht' foo '+variable
nicht funktioniert, aber funktioniert' foo '+variable+''
.Linien brechen durch
\
funktioniert für mich. Hier ist ein Beispiel:quelle
longStr = "account: " + account_id + \ ...
the backslash is redundant between brackets
print()
Ich war glücklich mit diesem:
quelle
.replace('\t','')
Ich finde, dass Sie beim Erstellen langer Zeichenfolgen normalerweise so etwas wie eine SQL-Abfrage erstellen. In diesem Fall ist dies am besten:
Was Levon vorgeschlagen hat, ist gut, kann aber fehleranfällig sein:
quelle
Sie können Variablen auch verketten, wenn Sie die Notation "" "verwenden:
BEARBEITEN: Mit benannten Parametern und .format () einen besseren Weg gefunden:
quelle
Dieser Ansatz verwendet:
Nur ein Backslash, um einen anfänglichen Zeilenvorschub zu vermeidenEntferntlokale Einrückungen mithilfe desTextwrap-inspect
Modulsaccount_id
unddef_id
.Dieser Weg sieht für mich am pythonischsten aus.
Update : 29.01.2019 Integrieren Sie den Vorschlag von @ ShadowRanger,
inspect.cleandoc
anstelle von zu verwendentextwrap.dedent
quelle
inspect.cleandoc
ist etwas schöner alstextwrap.dedent
, da die erste Zeile nicht leer sein muss und am Ende ein Zeilenfortsetzungszeichen steht.inspect.cleandoc
.In Python> = 3.6 können Sie formatierte Zeichenfolgenliterale (f-Zeichenfolge) verwenden.
quelle
Zum Beispiel:
Wenn der Wert der Bedingung eine Zeichenfolge sein soll, können Sie Folgendes tun:
quelle
Ich finde
textwrap.dedent
das Beste für lange Saiten wie hier beschrieben :quelle
Andere haben die Klammermethode bereits erwähnt, aber ich möchte hinzufügen, dass bei Klammern Inline-Kommentare zulässig sind.
Kommentar zu jedem Fragment:
Kommentar nach Fortsetzung nicht erlaubt:
Bei Verwendung von Backslash-Zeilenfortsetzungen (
\
) sind Kommentare nicht zulässig. Sie erhalten eineSyntaxError: unexpected character after line continuation character
Fehlermeldung.Bessere Kommentare für Regex-Zeichenfolgen:
Basierend auf dem Beispiel von https://docs.python.org/3/library/re.html#re.VERBOSE ,
quelle
Ich persönlich finde Folgendes am besten (einfach, sicher und pythonisch), um rohe SQL-Abfragen in Python zu schreiben, insbesondere wenn Sie das sqlite3-Modul von Python verwenden :
Vorteile
Nachteile
?
Platzhalter ersetzt werden, kann es etwas schwierig werden zu verfolgen,?
welche Variablen durch welche Python-Variablen ersetzt werden sollen, wenn viele davon in der Abfrage enthalten sind.quelle
cursor.execute(query.format(vars))
. Das sollte sich um deinen einzigen "Betrug" kümmern (hoffe ich).format
wäre nett, aber ich bin nicht sicher, ob die so formatierte Abfragezeichenfolge vor SQL-Injection sicher ist.cursor.execute(query.format(vars))
tun, profitieren Sie nicht mehr von vorbereiteten Anweisungen, sodass Sie für viele Arten von Problemen anfällig sind. Beginnen Sie mit der Tatsache, dass Sie die Parameter in der SQL-Abfrage doppelt zitieren müssen, wenn sie nicht nur Zahlen sind.Normalerweise benutze ich so etwas:
Wenn Sie störende Leerzeichen in jeder Zeile entfernen möchten, haben Sie folgende Möglichkeiten:
quelle
textwrap.dedent
Funktion an, die sich in der Standardbibliothek befindet und über die Funktionen verfügt, die Sie benötigen.inspect.cleandoc
ist etwas netter (weniger pingelig, ob Text in derselben Zeile wie die offenen Anführungszeichen angezeigt wird oder nicht, erfordert keine expliziten Zeilenfortsetzungszeichen).Ihre eigentliche Code nicht funktionieren sollte, können Sie Leerzeichen am Ende von „Linien“ fehlen (zB:
role.descr as roleFROM...
)Es gibt dreifache Anführungszeichen für mehrzeilige Zeichenfolgen:
Es enthält Zeilenumbrüche und zusätzliche Leerzeichen, aber für SQL ist dies kein Problem.
quelle
Sie können die sql-Anweisung auch in eine separate Datei einfügen
action.sql
und mit in die py-Datei ladenDie SQL-Anweisungen werden also vom Python-Code getrennt. Wenn die SQL-Anweisung Parameter enthält, die aus Python ausgefüllt werden müssen, können Sie die Zeichenfolgenformatierung verwenden (z. B.% s oder {field}).
quelle
"À la" Scala- Weg (aber ich denke, er ist der pythonischste Weg, den OQ verlangt):
Wenn Sie die letzte Str ohne Sprunglinien wünschen, setzen Sie einfach
\n
am Anfang des ersten Arguments der zweiten Ersetzung:Hinweis: Die weiße Linie zwischen "... Vorlagen". und "Also, ..." erfordert ein Leerzeichen nach dem
|
.quelle
tl; dr: Verwenden Sie
"""\
und"""
, um die Zeichenfolge wie in zu wickelnAus der offiziellen Python-Dokumentation :
quelle
Hey, probieren Sie so etwas aus und hoffen Sie, dass es funktioniert. In diesem Format erhalten Sie eine durchgehende Zeile, als hätten Sie sich erfolgreich nach dieser Eigenschaft erkundigt. "
quelle
Ich verwende eine rekursive Funktion, um komplexe SQL-Abfragen zu erstellen. Diese Technik kann im Allgemeinen verwendet werden, um große Zeichenfolgen zu erstellen und gleichzeitig die Lesbarkeit des Codes zu gewährleisten.
PS: Schauen Sie sich die fantastische Python-SQLparse-Bibliothek an, um bei Bedarf hübsche SQL-Abfragen zu drucken. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
quelle
Eine andere Option, die meiner Meinung nach besser lesbar ist, wenn der Code (z. B. eine Variable) eingerückt ist und die Ausgabezeichenfolge ein Einzeiler sein sollte (keine Zeilenumbrüche):
quelle
Verwenden Sie dreifache Anführungszeichen. Diese werden häufig verwendet, um zu Beginn von Programmen Dokumentzeichenfolgen zu erstellen, um deren Zweck und andere für die Erstellung relevante Informationen zu erläutern. Menschen verwenden diese auch in Funktionen, um den Zweck und die Anwendung von Funktionen zu erklären. Beispiel:
quelle
Ich mag diesen Ansatz, weil er das Lesen privilegiert. In Fällen, in denen wir lange Saiten haben, gibt es keinen Weg! Abhängig von der Einrückungsstufe, in der Sie sich befinden und die immer noch auf 80 Zeichen pro Zeile beschränkt ist ... Nun ... Sie müssen nichts weiter sagen. Meiner Meinung nach sind die Python-Styleguides immer noch sehr vage. Ich habe den @ Eero Aaltonen-Ansatz gewählt, weil er das Lesen und den gesunden Menschenverstand fördert. Ich verstehe, dass Styleguides uns helfen und unser Leben nicht durcheinander bringen sollten. Vielen Dank!
quelle
Aus der offiziellen Python-Dokumentation :
quelle
Um eine lange Zeichenfolge innerhalb eines Diktats zu definieren , die Zeilenumbrüche beizubehalten, aber die Leerzeichen wegzulassen , habe ich die Zeichenfolge in einer Konstanten wie der folgenden definiert:
quelle
Als allgemeine Herangehensweise an lange Zeichenfolgen in Python können Sie dreifache Anführungszeichen verwenden
split
undjoin
:Ausgabe:
In Bezug auf die Frage von OP zu einer SQL-Abfrage wird in der folgenden Antwort die Richtigkeit dieses Ansatzes zum Erstellen von SQL-Abfragen außer Acht gelassen, und es wird nur darauf geachtet, lange Zeichenfolgen ohne zusätzliche Importe lesbar und ästhetisch zu erstellen. Es ignoriert auch die damit verbundene Rechenlast.
Mit dreifachen Anführungszeichen erstellen wir eine lange und lesbare Zeichenfolge, die wir dann in eine Liste
split()
aufteilen, indem wir das Leerzeichen entfernen und es dann wieder zusammenfügen' '.join()
. Zum Schluss fügen wir die Variablen mit demformat()
Befehl ein:Produziert:
Bearbeiten: Dieser Ansatz entspricht nicht PEP8, aber ich finde ihn manchmal nützlich
quelle
Im Allgemeinen verwende ich
list
undjoin
für mehrzeilige Kommentare / Zeichenfolgen.Sie können eine beliebige Zeichenfolge verwenden, um alle diese Listenelemente wie '
\n
' (Zeilenumbruch) oder ',
' (Komma) oder '' (Leerzeichen) zu verbinden.
Prost..!!
quelle