Seite 1 von 1

Lesbarer Code: String über mehrere Zeilen

Verfasst: Freitag 6. März 2009, 18:28
von bitztoo
Hallo,

Ich hab nun schon ein paar Python Progrämmchen geschrieben und stosse immer wieder auf das gleiche Problem, finde aber keine elegante Lösung dazu. Ich versuche, mich beim Coden möglichst an den Style Guide (PEP 8 - http://www.python.org/dev/peps/pep-0008/) zu halten. Dieser empfiehlt, die maximale Länge einer Zeile auf 79 Zeichen zu beschränken. Mein Problem ist nun das folgende: wie definiere ich am besten einen langen String? Beispiel:

Code: Alles auswählen

class SomeClass:
	def some_function(self, some_field_1="", some_field_2=""):
		sql_query = "SELECT field_1, field_2, field_3 FROM some_table WHERE some_field_1 = '%s' AND some_field_2 = '%s'" % (some_field_1, some_field_2)
ich könnte nun folgendes tun:

Code: Alles auswählen

class SomeClass:
	def some_function(self, some_field_1="", some_field_2=""):
		sql_query = """SELECT field_1, field_2, field_3 FROM some_table WHERE 
			some_field_1 = '%s' AND some_field_2 = '%s'""" % \
			(some_field_1, some_field_2)
..dann hat aber der sql_query String den Zeilenwechsel und die Tabulatoren bzw. Leerzeichen drin, was ich nicht sehr toll finde. Andere Dinge wie den String in mehrere aufzuteilen und per + zu verketten find ich ebenfalls suboptimal.

Kennt jemand da ne elegante Möglichkeit? Ich bin für jegliche Tips dankbar!

Verfasst: Freitag 6. März 2009, 18:39
von DasIch
Man kann sich zunutze machen das Strings die direkt hintereinander geschrieben werden impliziert konkateniert werden.

Code: Alles auswählen

In [23]: print ('hello'
   ....:        'world')
helloworld

Verfasst: Freitag 6. März 2009, 18:42
von b.esser-wisser
Lass Python mehr arbeit übernehmen, nutze die "implicit string-concatenation" (d.h. Strings, zwischen denen nur Leerzeichen stehen, werden aneinnder gehängt):

Code: Alles auswählen

#A (Die "\"sind leider haesslich ;) ):
sql_query = "SELECT field_1, field_2, field_3 "\
            "FROM some_table WHERE "\
            "some_field_1 = %s AND some_field_2 = %s"
#B (sieht aus, als haette jemand ein Tuple versaut ;) ):
sql_query = ("SELECT field_1, field_2, field_3" " "
             "FROM some_table WHERE" " "
             "some_field_1 = %s AND some_field_2 = %s")
Und bei SQL-Queries benutzt man kein "%" beim einsetzen, sondern parametrisierte Queries, d.h. dein SQl-modul übernimmt das einsetzen und escapen der Werte ([wiki]Parametrisierte SQL-Queries[/wiki]).

hth, Jörg
Edit: wiki-link eingebaut
Edit2: Leerzeichen ergänzt, danke BlackJack
...: von phpbb verhunzten Link korrigiert

Verfasst: Freitag 6. März 2009, 18:51
von BlackJack
@b.esser-wisser: Da fehlen aber noch ein paar Leerzeichen in den Zeichenketten. :-)

Verfasst: Freitag 6. März 2009, 18:55
von derdon
Und noch ein Wiki-Eintrag: [wiki]Lange Zeilen im Sourcecode[/wiki]

Verfasst: Freitag 6. März 2009, 18:55
von b.esser-wisser
BlackJack hat geschrieben:@b.esser-wisser: Da fehlen aber noch ein paar Leerzeichen in den Zeichenketten. Smile
Jupp :roll: , aber es wäre ja langweilig, wenn jeder hier Code einfach kopieren könnte :wink:

hth, Jörg

Verfasst: Freitag 6. März 2009, 19:11
von Nocta
Und warum machst du nochmal extra einen eigenen String für das Leerzeichen? :p

Verfasst: Freitag 6. März 2009, 19:14
von b.esser-wisser
Nocta hat geschrieben:Und warum machst du nochmal extra einen eigenen String für das Leerzeichen?
Weil ich es kann 8)

Verfasst: Freitag 6. März 2009, 19:15
von bitztoo
@b.esser-wisser: Methode A ist eigentlich das, was ich gesucht habe, die Backslashes stören mich nicht besonders. Danke für den Tip!

Parametrisierte SQL-Queries: Auch ein guter Hinweis, nur hab ich das Problem, dass ich mir mehrere Queries in einer Methode zusammenbaue und die dann zurückgebe, also müssen sie bereits Werte enthalten. Ich müsste das ganze völlig neu schreiben. Das Skript arbeitet allerdings nicht mit Benutzereingaben und ist auch nicht öffentlich zugänglich bzw. aufrufbar.

Übrigens hats in Deinem Wiki-Link zu den Parametrisierten SQL-Queries noch ein ")" am Ende des Links zuviel ;-)

Verfasst: Freitag 6. März 2009, 19:26
von b.esser-wisser
bitztoo hat geschrieben:Übrigens hats in Deinem Wiki-Link zu den Parametrisierten SQL-Queries noch ein ")" am Ende des Links zuviel Wink
Jetzt nicht mehr.
(btw.: extrem toll, dass automatisch BBCode erzeugt wird, der (anscheinend) nicht dokumentiert ist :( /rant)