Pythonische Möglichkeit, eine lange mehrzeilige Zeichenfolge zu erstellen

Ich habe eine sehr lange Abfrage. Ich möchte es in mehrere Zeilen in Python teilen. Ein Weg, um es in JavaScript zu tun, würde mehrere Sätze verwenden und sie mit einem + Betreiber verbinden (ich weiß, vielleicht ist es nicht der effizienteste Weg, es zu tun, aber ich bin nicht wirklich besorgt über Leistung in diesem Stadium, nur Code Lesbarkeit ). 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 geklappt, also habe ich die lange Saite aufgeteilt. Allerdings bin ich mir nicht sicher, ob dies die einzige / beste / pythonische Art ist, es zu tun. Es sieht umständlich aus. Tatsächlicher Code:

  • Die meisten effizienten Weg, um eine große .csv in Python zu analysieren?
  • PYTHON-DLL-Last fehlgeschlagen
  • Pandas schreiben Dataframe zu anderen postgresql Schema
  • Wie bekomme ich Dateiname beim Ausführen von mapreduce Job auf EC2?
  • Wörterbuch von csv file python
  • Kein Modul namens py2exe
  •  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 

  • Warum enthält pypi-Upload \ r \ n in POST-Anforderungsdaten?
  • __init __ () fehlt 1 erforderliches Positionsargument: 'Menge'
  • Aufrufen einer Klassenmethode aus einer anderen Klassenmethode in Python 2.7
  • Python-Capture-Stdout aus dem Unterprozess Zeile für Zeile
  • Wie kann ich mehrere Versionen von Python auf dem neuesten OS X installieren und sie parallel verwenden?
  • Warum gibt mir argparse eine List-in-a-list?
  • 14 Solutions collect form web for “Pythonische Möglichkeit, eine lange mehrzeilige Zeichenfolge zu erstellen”

    Sprechen Sie über mehrzeilige Saiten? Einfache, dreifache Zitate verwenden, um sie zu starten und zu beenden.

     s = """ this is a very long string if I had the energy to type more and more ...""" 

    Sie können auch einfache Anführungszeichen verwenden (3 von ihnen natürlich am Anfang und Ende) und behandeln Sie die resultierende Zeichenkette wie jeder andere String.

    HINWEIS : Genau wie bei jedem String wird zwischen den Anfangs- und Endzitaten ein Teil der Zeichenfolge, so dass dieses Beispiel einen führenden Leerzeichen hat (wie von @ root45 hervorgehoben). Diese Zeichenfolge enthält auch Leerzeichen und Zeilenumbrüche.

    Ich,

     ' this is a very\n long string if I had the\n energy to type more and more ...' 

    Schließlich kann man auch lange Strecken in Python konstruieren:

      s = ("this is a very" "long string too" "for sure ..." ) 

    Die keine zusätzlichen Leerzeichen oder Zeilenumbrüche enthalten (dies ist ein bewusstes Beispiel, was die Wirkung des Überspringens von Leerzeichen dazu führen wird):

     'this is a verylong string toofor sure ...' 

    Keine Kommas nötig, legen Sie einfach die Saiten zusammen, um zu einem Paar von Klammern zusammengefügt zu werden, und achten Sie darauf, alle benötigten Leerzeichen und Zeilenumbrüche zu berücksichtigen.

    Wenn Sie nicht wollen, eine mehrzeilige Zeichenfolge, sondern nur eine lange Einzellinie String, können Sie Klammern verwenden, nur stellen Sie sicher, dass Sie keine Kommas zwischen den String-Segmente, dann wird es ein Tupel sein.

     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) 

    In einer SQL-Anweisung wie das, was du konstruierst, würden auch multiline Strings gut. Aber wenn der zusätzliche Whitespace eine multiline String enthalten würde wäre ein Problem, dann wäre dies ein guter Weg, um zu erreichen, was Sie wollen.

    Brechen von Linien durch \ arbeitet für mich. Hier ist ein Beispiel:

     longStr = "This is a very long string " \ "that I wrote to help somebody " \ "who had a question about " \ "writing long strings in Python" 

    Ich fand mich glücklich mit diesem:

     string = """This is a very long string, containing commas, that I split up for readability""".replace('\n',' ') 

    Ich finde, dass beim Bau von langen Saiten, sind Sie in der Regel etwas wie das Erstellen einer SQL-Abfrage, in diesem Fall ist dies am besten:

     query = ' '.join(( # note double parens, join() takes an iterable "SELECT foo", "FROM bar", "WHERE baz", )) 

    Was Levon vorgeschlagen hat, ist gut, könnte aber anfällig für Fehler sein:

     query = ( "SELECT foo" "FROM bar" "WHERE baz" ) query == "SELECT fooFROM barWHERE baz" # probably not what you want 

    Sie können auch Variablen verknüpfen bei der Verwendung von "" "Notation:

     foo = '1234' long_string = """fosdl a sdlfklaskdf as as df ajsdfj asdfa sld a sdf alsdfl alsdfl """ + foo + """ aks asdkfkasdk fak""" 

    EDIT: Einen besseren Weg gefunden, mit benannten params und .format ():

     body = """ <html> <head> </head> <body> <p>Lorem ipsum.</p> <dl> <dt>Asdf:</dt> <dd><a href="{link}">{name}</a></dd> </dl> </body> </html> """.format( link='http://www.asdf.com', name='Asdf', ) print(body) 

    Beispielsweise:

     sql = ("select field1, field2, field3, field4 " "from table " "where condition1={} " "and condition2={}").format(1, 2) Output: 'select field1, field2, field3, field4 from table where condition1=1 and condition2=2' 

    Wenn der Wert der Bedingung ein String sein sollte, können Sie dies tun:

     sql = ("select field1, field2, field3, field4 " "from table " "where condition1='{0}' " "and condition2='{1}'").format('2016-10-12', '2017-10-12') Output: "select field1, field2, field3, field4 from table where condition1='2016-10-12' and condition2='2017-10-12'" 

    Ihr aktueller Code sollte nicht funktionieren, Sie fehlen Whitespaces am Ende von "Zeilen" (zB: role.descr as roleFROM... )

    Es gibt Triplequotes für mehrzeiligen String:

     string = """line line2 line3""" 

    Es wird die Zeilenumbrüche und zusätzliche Leerzeichen enthalten, aber für SQL ist das kein Problem.

    In Python> = 3.6 können Sie formatierte String-Literale (f-String)

     query= f'''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}''' 

    Sie können auch die sql-Anweisung in eine action.sql Datei action.sql und laden Sie sie in der py-Datei mit

     with open('action.sql') as f: query = f.read() 

    So werden die sql-Anweisungen vom Python-Code getrennt. Wenn es Parameter in der sql-Anweisung gibt, die von python gefüllt werden muss, kannst du String-Forming verwenden (wie% s oder {field})

    Ich verwende eine rekursive Funktion, um komplexe SQL-Abfragen zu erstellen. Diese Technik kann im Allgemeinen verwendet werden, um große Strings zu bauen, während die Code-Lesbarkeit beibehalten wird.

     # Utility function to recursively resolve SQL statements. # CAUTION: Use this function carefully, Pass correct SQL parameters {}, # TODO: This should never happen but check for infinite loops def resolveSQL(sql_seed, sqlparams): sql = sql_seed % (sqlparams) if sql == sql_seed: return ' '.join([x.strip() for x in sql.split()]) else: return resolveSQL(sql, sqlparams) 

    PS: Schauen Sie sich die fantastische Python-sqlparse-Bibliothek an, um SQL-Abfragen bei Bedarf zu drucken. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format

    Eine weitere Option, die ich denke, ist besser lesbar, wenn der Code (zB Variable) eingerückt ist und die Ausgabe-String sollte ein Ein-Liner (keine Newlines):

     def some_method(): long_string = """ a presumptuous long string which looks a bit nicer in a text editor when written over multiple lines """.strip('\n').replace('\n', ' ') return long_string 

    "À la" Scala Weg (aber ich denke, ist die pythonischste Art, wie OQ verlangt):

     description = """ | The intention of this module is to provide a method to | pass meta information in markdown_ header files for | using it in jinja_ templates. | | Also, to provide a method to use markdown files as jinja | templates. Maybe you prefer to see the code than | to install it.""".replace('\n | \n','\n').replace(' | ',' ') 

    Wenn du endgültige Str ohne Sprunglinien willst, gehe einfach zu Beginn des ersten Arguments des zweiten Ersetzers:

     .replace('\n | ',' ')`. 

    Hinweis: die weiße Linie zwischen "… Vorlagen". Und "Auch, …" erfordert einen Whitespace nach dem | .

    Ich mag diesen Ansatz, weil es das Lesen freigibt. In Fällen, in denen wir lange Saiten haben, gibt es keinen Weg! Abhängig von der Ebene der Einrückung sind Sie in und noch begrenzt auf 80 Zeichen pro Zeile … Nun … Keine Notwendigkeit, etwas anderes zu sagen. In meiner Sicht sind die Python-Stilführer immer noch sehr vage. Ich habe die @Eero Aaltonen Ansatz, weil es Privilegien Lesung und gesunden Menschenverstand. Ich verstehe, dass Stilführer uns helfen und nicht unser Leben ein Durcheinander machen Vielen Dank! Bitte kommentieren!

     class ClassName(): def method_name(): if condition_0: if condition_1: if condition_2: some_variable_0 =\ """ some_js_func_call( undefined, { 'some_attr_0': 'value_0', 'some_attr_1': 'value_1', 'some_attr_2': '""" + some_variable_1 + """' }, undefined, undefined, true ) """ 
    Python ist die beste Programmiersprache der Welt.