Pythonovský způsob vytvoření dlouhého víceřádkového řetězce

Mám velmi dlouhý dotaz. Chtěl bych ho v Pythonu rozdělit na několik řádků. Způsob, jak to udělat v JavaScriptu, by byl použít několik vět a spojit je operátorem + (vím, možná to'není nejefektivnější způsob, ale v této fázi mi nejde o výkon, jen o čitelnost kódu). Příklad:

var long_string = 'some text not important. just garbage to' +
                  'illustrate my example';

Zkoušel jsem něco podobného udělat v Pythonu, ale nefungovalo to, tak jsem použil \ pro rozdělení dlouhého řetězce. Nejsem si však'jistý, zda je to jediný/nejlepší/nejpitomější způsob, jak to udělat. Vypadá to nešikovně. Skutečný kód:

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
Řešení

Mluvíte o víceřádkových řetězcích? Snadno, použijte trojité uvozovky na jejich začátek a konec.

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

Můžete použít i jednoduché uvozovky (samozřejmě 3 na začátku a na konci) a s výsledným řetězcem s zacházet jako s jakýmkoli jiným řetězcem.

POZNÁMKA: Stejně jako u jiných řetězců se vše, co je mezi počátečními a koncovými uvozovkami, stává součástí řetězce, takže tento příklad má úvodní mezeru (jak upozornil @root45). Tento řetězec bude také obsahovat jak mezery, tak nové řádky.

Tj:

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

Nakonec lze v jazyce Python sestavit dlouhé řádky také takto:

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

který nebude obsahovat žádné další mezery nebo nové řádky (toto je záměrný příklad, který ukazuje, jaký efekt bude mít vynechání mezer):

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

Čárky nejsou potřeba, jednoduše vložte řetězce, které mají být spojeny, do dvojice závorek a nezapomeňte zohlednit všechny potřebné mezery a nové řádky.

Komentáře (11)

Pokud nechcete víceřádkový řetězec, ale jen dlouhý jednořádkový řetězec, můžete použít závorky, jen se ujistěte, že mezi úseky řetězce nejsou čárky, pak to bude tuple.

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)

V příkazu SQL, jako je ten, který konstruujete, by víceřádkové řetězce byly také v pořádku. Pokud by však problémem byly bílé znaky navíc, které by víceřádkový řetězec obsahoval, pak by to byl dobrý způsob, jak dosáhnout toho, co chcete.

Komentáře (8)

Váš aktuální kód by neměl fungovat, chybí vám bílé znaky na konci "řádků" (např.: role.descr as roleFROM...)

Pro víceřádkový řetězec jsou tam trojité uvozovky:

string = """line
  line2
  line3"""

Bude obsahovat zalomení řádku a mezery navíc, ale pro SQL to není problém.

Komentáře (0)