1582 votes

Méthode Pythonic pour créer une longue chaîne multiligne

J'ai une très longue question. Je tiens à le diviser en plusieurs lignes en python. Un moyen de le faire en javascript seraient à l'aide de plusieurs phrases et de les rejoindre avec un opérateur + (je sais, c'est peut-être pas le moyen le plus efficace pour le faire, mais je ne suis pas vraiment préoccupé par la performance à ce stade, la lisibilité du code). Exemple:

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

J'ai essayé de faire quelque chose de similaire en python, mais il ne fonctionne pas, j'ai donc utilisé \ diviser le long de la chaîne. Cependant, je ne suis pas sûr si c'est le seul ou le meilleur/pythonicest façon de faire. Il a l'air gêné. 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

Toutes les suggestions seraient appréciées

2680voto

Levon Points 34085

Tu parles de multi-ligne de chaînes? Facile, utilisez triple guillemets de début et de fin.

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

Vous pouvez utiliser des guillemets simples (3 d'entre eux, bien sûr, au début et à la fin) et de traiter la chaîne résultante s tout comme n'importe quelle autre chaîne.

REMARQUE: tout comme avec n'importe quelle chaîne, quoi que ce soit entre le début et la fin des citations devient partie intégrante de la chaîne, afin que cet exemple est l'un des principaux vide (comme l'a fait remarquer @root45). Cette chaîne sera également contenir à la fois des espaces et des retours à la ligne.

I. e.,:

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

Enfin, on peut également construire des longues lignes en Python comme ceci:

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

qui ne comprennent aucune des espaces supplémentaires ou des retours à la ligne:

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

Pas de virgules nécessaires, il suffit de placer les chaînes de caractères à être réunis dans une paire de parenthèses et il faut prendre en compte les espaces et retours à la ligne.

237voto

Jesse Points 1113

Si vous ne voulez pas de chaîne multiligne mais simplement une longue chaîne de caractères, vous pouvez utiliser des parenthèses, assurez-vous de ne pas inclure de virgules entre les segments de chaîne, alors ce sera un 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)
 

Dans une instruction SQL comme ce que vous construisez, les chaînes multilignes seraient également bien. Mais si l'espace supplémentaire qu'une chaîne multiligne contient serait un problème, alors ce serait un bon moyen d'obtenir ce que vous voulez.

158voto

amphibient Points 4704

Rompre les lignes de \ fonctionne pour moi. Voici un exemple:

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

57voto

Eero Aaltonen Points 590

Je me suis trouvé heureux avec celui-ci:

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

12voto

Tom Points 7393

Ce n'est pas une réponse à votre question. Aller avec les citations triples suggérées par Levon. Mais vous devriez utiliser des requêtes paramétrées pour éviter le risque d'injection SQL. Quelque chose comme

 sql = """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 = ? AND
record_def.account_id= ? AND
def_id= ?"""
parameters = [account_id, account_id, def_id]
cursor.execute(sql, parameters)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X