J'ai une très longue requête. Je voudrais le diviser en plusieurs lignes en Python. Une façon de le faire en JavaScript serait d'utiliser plusieurs phrases et de les joindre à un +
opérateur (je sais, ce n'est peut-être pas le moyen le plus efficace de le faire, mais je ne suis pas vraiment préoccupé par les performances à ce stade, juste 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 cela n'a pas fonctionné, j'ai donc l'habitude \
de diviser la longue chaîne. Cependant, je ne suis pas sûr que ce soit la seule / meilleure / meilleure façon de le faire. Ça a l'air maladroit. Code réel:
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
python
string
multiline
multilinestring
Pablo Mescher
la source
la source
Réponses:
Parlez-vous de chaînes multi-lignes? Facile, utilisez des guillemets triples pour les démarrer et les terminer.
Vous pouvez également utiliser des guillemets simples (3 d'entre eux bien sûr au début et à la fin) et traiter la chaîne résultante
s
comme n'importe quelle autre chaîne.REMARQUE : comme pour toute chaîne, tout ce qui se trouve entre les guillemets de début et de fin fait partie de la chaîne, donc cet exemple a un blanc de début (comme indiqué par @ root45). Cette chaîne contiendra également des espaces et des sauts de ligne.
C'est à dire,:
Enfin, on peut également construire de longues lignes en Python comme ceci:
qui ne comprend aucun espace supplémentaire ou (ce qui est des sauts de ligne un exemple montrant délibérément ce que l'effet de sauter des blancs entraînera):
Aucune virgule n'est requise, placez simplement les chaînes à assembler dans une paire de parenthèses et assurez-vous de prendre en compte les blancs et les nouvelles lignes nécessaires.
la source
+
opérateur ne fait-elle pas la concaténation au moment de l'exécution?textwrap.dedent
pour supprimer les espaces blancs non désirés. docs.python.org/3/library/textwrap.html#textwrap.dedentSi vous ne voulez pas de chaîne multiligne mais que vous n'avez qu'une longue chaîne à une seule ligne, vous pouvez utiliser des parenthèses, assurez-vous simplement de ne pas inclure de virgules entre les segments de chaîne, ce sera un tuple.
Dans une instruction SQL comme celle que vous construisez, les chaînes multilignes conviendraient également. Mais si l'espace blanc supplémentaire qu'une chaîne multiligne contiendrait serait un problème, alors ce serait un bon moyen de réaliser ce que vous voulez.
la source
,
'
?.format(...)
après la parenthèse fermante.%
le formatage de la notation doit aussi fonctionner mais je ne l'ai pas essayé' foo '+variable
ne fonctionnera pas, mais le' foo '+variable+''
fera.Briser les lignes par les
\
œuvres pour moi. Voici un exemple:la source
longStr = "account: " + account_id + \ ...
the backslash is redundant between brackets
quand je l' ai écrit à l' intérieurprint()
Je me suis contenté de celui-ci:
la source
.replace('\t','')
Je trouve que lors de la construction de longues chaînes, vous faites généralement quelque chose comme la construction d'une requête SQL, auquel cas c'est le meilleur:
Ce que Levon a suggéré est bon, mais pourrait être vulnérable aux erreurs:
la source
Vous pouvez également concaténer des variables lorsque vous utilisez la notation "" ":
EDIT: Trouvé une meilleure façon, avec des paramètres nommés et .format ():
la source
Cette approche utilise:
une seule barre oblique inverse pour éviter un saut de ligne initialtextwrapinspect
account_id
etdef_id
.De cette façon, cela me semble le plus pythonique.
Mise à jour : 29/01/2019 Incorporez la suggestion de @ ShadowRanger à utiliser
inspect.cleandoc
au lieu detextwrap.dedent
la source
inspect.cleandoc
est légèrement plus agréable quetextwrap.dedent
, car il ne nécessite pas que la première ligne soit vide avec un caractère de continuation de ligne à la fin.inspect.cleandoc
pour cela.En Python> = 3.6, vous pouvez utiliser des littéraux de chaîne formatés (chaîne f)
la source
Par exemple:
si la valeur de condition doit être une chaîne, vous pouvez faire comme ceci:
la source
Je trouve
textwrap.dedent
le meilleur pour les cordes longues comme décrit ici :la source
D'autres ont déjà mentionné la méthode des parenthèses, mais j'aimerais ajouter qu'avec les parenthèses, les commentaires en ligne sont autorisés.
Commentez chaque fragment:
Commentaire non autorisé après la suite:
Lors de l'utilisation de continuations de ligne de barre oblique inverse (
\
), les commentaires ne sont pas autorisés. Vous recevrez uneSyntaxError: unexpected character after line continuation character
erreur.Meilleurs commentaires pour les chaînes Regex:
Basé sur l'exemple de https://docs.python.org/3/library/re.html#re.VERBOSE ,
la source
Personnellement, je trouve que ce qui suit est le meilleur moyen (simple, sûr et Pythonic) d'écrire des requêtes SQL brutes en Python, en particulier lors de l'utilisation du module sqlite3 de Python :
Avantages
Les inconvénients
?
espace réservé, il peut devenir un peu difficile de savoir laquelle?
doit être remplacée par quelle variable Python lorsqu'il y en a beaucoup dans la requête.la source
cursor.execute(query.format(vars))
. Cela devrait prendre soin de votre seul "con" (j'espère).format
serait bien, mais je ne suis pas sûr que la chaîne de requête formatée de cette façon soit à l'abri de l'injection SQL.cursor.execute(query.format(vars))
bénéficiez plus des instructions préparées, vous êtes donc vulnérable à de nombreux types de problèmes, à commencer par le fait que si les paramètres ne sont pas uniquement des nombres, vous devez les citer deux fois dans la requête SQL.J'utilise habituellement quelque chose comme ça:
Si vous souhaitez supprimer les espaces vides ennuyeux dans chaque ligne, vous pouvez procéder comme suit:
la source
textwrap.dedent
fonction de Python , qui se trouve dans la bibliothèque standard, elle a les fonctionnalités dont vous avez besoin.inspect.cleandoc
est légèrement plus agréable (moins capricieux quant à savoir si le texte apparaît ou non sur la même ligne que les guillemets ouverts, ne nécessite pas de caractères de continuation de ligne explicites).Votre code actuel ne doit pas travailler, il vous manque espaces à l'extrémité des « lignes » (par exemple:
role.descr as roleFROM...
)Il existe des guillemets triples pour la chaîne multiligne:
Il contiendra les sauts de ligne et les espaces supplémentaires, mais pour SQL ce n'est pas un problème.
la source
Vous pouvez également placer l'instruction sql dans un fichier séparé
action.sql
et la charger dans le fichier py avecAinsi, les instructions sql seront séparées du code python. S'il y a des paramètres dans l'instruction sql qui doivent être remplis à partir de python, vous pouvez utiliser le formatage de chaînes (comme% s ou {field})
la source
"À la" façon Scala (mais je pense que c'est la façon la plus pythonique comme OQ l'exige):
Si vous voulez une chaîne finale sans lignes de saut, mettez simplement
\n
au début du premier argument du deuxième remplacement:Remarque: la ligne blanche entre "... modèles". et "Aussi, ..." nécessite un espace après le
|
.la source
tl; dr: utilisez
"""\
et"""
pour envelopper la chaîne , comme dansDe la documentation officielle de python :
la source
Hé, essayez quelque chose comme ça, j'espère que cela fonctionne, comme dans ce format, il vous renverra une ligne continue comme si vous vous êtes bien renseigné sur cette propriété.
la source
J'utilise une fonction récursive pour construire des requêtes SQL complexes. Cette technique peut généralement être utilisée pour créer de grandes chaînes tout en conservant la lisibilité du code.
PS: Jetez un oeil à la bibliothèque impressionnante python-sqlparse pour joliment imprimer des requêtes SQL si nécessaire. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
la source
Une autre option qui, à mon avis, est plus lisible lorsque le code (par exemple, une variable) est en retrait et que la chaîne de sortie doit être une ligne (pas de nouvelle ligne):
la source
Utilisez des guillemets triples. Les gens les utilisent souvent pour créer des docstrings au début des programmes pour expliquer leur objectif et d'autres informations pertinentes à sa création. Les gens les utilisent également dans les fonctions pour expliquer le but et l'application des fonctions. Exemple:
la source
J'aime cette approche car elle privilégie la lecture. Dans les cas où nous avons de longues cordes, il n'y a aucun moyen! Selon le niveau d'indentation dans lequel vous vous trouvez et toujours limité à 80 caractères par ligne ... Et bien ... Pas besoin de dire autre chose. À mon avis, les guides de style python sont encore très vagues. J'ai adopté l'approche @Eero Aaltonen car elle privilégie la lecture et le bon sens. Je comprends que les guides de style devraient nous aider et ne pas gâcher notre vie. Merci!
la source
De la documentation officielle de python :
la source
Pour définir une longue chaîne à l'intérieur d'un dict, en gardant les sauts de ligne mais en omettant les espaces , j'ai fini par définir la chaîne dans une constante comme celle-ci:
la source
En tant qu'approche générale des chaînes longues en Python, vous pouvez utiliser des guillemets triples
split
etjoin
:Production:
En ce qui concerne la question d'OP relative à une requête SQL, la réponse ci-dessous ne tient pas compte de l'exactitude de cette approche de construction de requêtes SQL et se concentre uniquement sur la construction de longues chaînes de manière lisible et esthétique sans importations supplémentaires. Il ignore également la charge de calcul que cela implique.
En utilisant des guillemets triples, nous construisons une chaîne longue et lisible que nous décomposons ensuite en une liste en utilisant
split()
ainsi en supprimant les espaces blancs, puis en les réunissant à nouveau avec' '.join()
. Enfin, nous insérons les variables à l'aide de laformat()
commande:Produit:
Edit: Cette approche n'est pas conforme à PEP8 mais je la trouve parfois utile
la source
En général, j'utilise
list
etjoin
pour les commentaires / chaîne multi-lignes.vous pouvez utiliser n'importe quelle chaîne pour joindre tous ces éléments de la liste comme '
\n
' (nouvelle ligne) ou ',
' (virgule) ou '' (espace)
À votre santé..!!
la source