Lesbarer Code: String über mehrere Zeilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
bitztoo
User
Beiträge: 4
Registriert: Freitag 6. März 2009, 18:07

Lesbarer Code: String über mehrere Zeilen

Beitragvon bitztoo » Freitag 6. März 2009, 18:28

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!
DasIch
User
Beiträge: 2405
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Freitag 6. März 2009, 18:39

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
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Beitragvon b.esser-wisser » Freitag 6. März 2009, 18:42

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
Zuletzt geändert von b.esser-wisser am Freitag 6. März 2009, 19:22, insgesamt 2-mal geändert.
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
BlackJack

Beitragvon BlackJack » Freitag 6. März 2009, 18:51

@b.esser-wisser: Da fehlen aber noch ein paar Leerzeichen in den Zeichenketten. :-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Beitragvon derdon » Freitag 6. März 2009, 18:55

Und noch ein Wiki-Eintrag: [wiki]Lange Zeilen im Sourcecode[/wiki]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Beitragvon b.esser-wisser » Freitag 6. März 2009, 18:55

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Beitragvon Nocta » Freitag 6. März 2009, 19:11

Und warum machst du nochmal extra einen eigenen String für das Leerzeichen? :p
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Beitragvon b.esser-wisser » Freitag 6. März 2009, 19:14

Nocta hat geschrieben:Und warum machst du nochmal extra einen eigenen String für das Leerzeichen?

Weil ich es kann 8)
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
bitztoo
User
Beiträge: 4
Registriert: Freitag 6. März 2009, 18:07

Beitragvon bitztoo » Freitag 6. März 2009, 19:15

@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 ;-)
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Beitragvon b.esser-wisser » Freitag 6. März 2009, 19:26

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)
Wir haben schon 10% vom 21. Jahrhundert hinter uns!

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]