Quelle est l'indentation appropriée pour les chaînes multilignes Python dans une fonction?
def method():
string = """line one
line two
line three"""
ou
def method():
string = """line one
line two
line three"""
ou autre chose?
Il semble assez étrange d'avoir la chaîne suspendue en dehors de la fonction dans le premier exemple.
method.__doc__
n'est pas modifié par Python lui-même plus que tout autrestr
littéral.Réponses:
Vous voulez probablement vous aligner avec le
"""
Étant donné que les retours à la ligne et les espaces sont inclus dans la chaîne elle-même, vous devrez la post-traiter. Si vous ne voulez pas faire cela et que vous avez beaucoup de texte, vous pouvez le stocker séparément dans un fichier texte. Si un fichier texte ne fonctionne pas bien pour votre application et que vous ne voulez pas post-traiter, j'irais probablement avec
Si vous souhaitez post-traiter une chaîne multiligne pour supprimer les parties dont vous n'avez pas besoin, vous devez considérer le
textwrap
module ou la technique de post-traitement des docstrings présentés dans PEP 257 :la source
trim()
fonction spécifiée dans PEP257 est implémentée dans la bibliothèque standard en tant queinspect.cleandoc
.string
latext
ou quoi que ce soit d'une longueur différente, vous devez maintenant mettre à jour l'empreinte de littéralement chaque ligne de la chaîne multiligne juste pour le faire correspondre avec le"""
correctement. La stratégie d'indentation ne devrait pas compliquer les futurs refactors / maintenance, et c'est l'un des endroits où PEP échoue vraimentLa
textwrap.dedent
fonction permet de commencer avec une indentation correcte dans la source , puis de la retirer du texte avant de l'utiliser.Le compromis, comme l'ont noté certains autres, est qu'il s'agit d'un appel de fonction supplémentaire sur le littéral; Tenez-en compte lorsque vous décidez où placer ces littéraux dans votre code.
La fin
\
du littéral du message de journal est de s'assurer que le saut de ligne n'est pas dans le littéral; De cette façon, le littéral ne commence pas par une ligne vierge et commence à la place par la ligne complète suivante.La valeur de retour de
textwrap.dedent
est la chaîne d'entrée avec toutes les indentations d'espaces en tête courantes supprimées sur chaque ligne de la chaîne. Lalog_message
valeur ci-dessus sera donc:la source
textwrap.dedent()
appel est une valeur constante, tout comme son argument d'entrée.def foo: return foo.x
puis la ligne suivantefoo.x = textwrap.dedent("bar")
.Utilisez
inspect.cleandoc
comme ça:L'indentation relative sera maintenue comme prévu. Comme commenté ci - dessous, si vous voulez garder précédent lignes vides, utilisation
textwrap.dedent
. Cependant, cela conserve également le premier saut de ligne.la source
inspect.cleandoc
existe depuis Python 2.6 , qui était 2008 ..? Absolument la réponse la plus propre, surtout parce qu'elle n'utilise pas le style de retrait suspendu, qui gaspille juste une quantité d'espace inutileUne option qui semble manquer dans les autres réponses (uniquement mentionnée au fond dans un commentaire de naxa) est la suivante:
Cela permettra un alignement correct, joindra les lignes implicitement et gardera toujours le décalage de ligne qui, pour moi, est l'une des raisons pour lesquelles je voudrais quand même utiliser des chaînes multilignes.
Il ne nécessite aucun post-traitement, mais vous devez ajouter manuellement le
\n
à n'importe quel endroit où vous souhaitez que la ligne se termine. Soit en ligne, soit en tant que chaîne distincte après. Ce dernier est plus facile à copier-coller.la source
Quelques options supplémentaires. Dans Ipython avec pylab activé, dedent est déjà dans l'espace de noms. J'ai vérifié et c'est de matplotlib. Ou il peut être importé avec:
Dans la documentation, il indique qu'il est plus rapide que l'équivalent textwrap et dans mes tests en ipython, il est en effet 3 fois plus rapide en moyenne avec mes tests rapides. Il a également l'avantage de supprimer toutes les lignes vides principales, ce qui vous permet d'être flexible dans la façon dont vous construisez la chaîne:
L'utilisation du matplotlib en fonction de ces trois exemples donnera le même résultat raisonnable. La fonction de dédoublement du texte aura une première ligne vierge avec le 1er exemple.
L'inconvénient évident est que textwrap est dans la bibliothèque standard tandis que matplotlib est un module externe.
Quelques compromis ici ... les fonctions dédentes rendent votre code plus lisible là où les chaînes sont définies, mais nécessitent un traitement ultérieur pour obtenir la chaîne au format utilisable. Dans docstrings, il est évident que vous devez utiliser une indentation correcte car la plupart des utilisations de docstring feront le traitement requis.
Lorsque j'ai besoin d'une chaîne non longue dans mon code, je trouve le code suivant, certes laid, où je laisse la longue chaîne tomber de l'indentation englobante. Échoue définitivement sur "Beau, c'est mieux que laid.", Mais on pourrait dire qu'il est plus simple et plus explicite que l'alternative dédente.
la source
Si vous voulez une solution rapide et facile et évitez de taper des retours à la ligne, vous pouvez opter pour une liste à la place, par exemple:
la source
je préfère
ou
la source
Mes deux cents, échappez à la fin de la ligne pour obtenir les retraits:
la source
Je suis venu ici à la recherche d'une simple doublure pour supprimer / corriger le niveau d'identification de la docstring pour l'impression, sans le rendre désordonné , par exemple en le faisant "accrocher en dehors de la fonction" dans le script.
Voici ce que j'ai fini par faire:
Évidemment, si vous indentez avec des espaces (par exemple 4) plutôt que la touche de tabulation, utilisez quelque chose comme ceci à la place:
Et vous n'avez pas besoin de supprimer le premier caractère si vous souhaitez que vos docstrings ressemblent à ceci:
la source
La première option est la bonne - avec une indentation incluse. Il est en style python - offre une lisibilité pour le code.
Pour l'afficher correctement:
la source
Cela dépend de la façon dont vous souhaitez que le texte s'affiche. Si vous souhaitez que tout soit aligné à gauche, formatez-le comme dans le premier extrait ou parcourez les lignes en coupant à gauche tout l'espace.
la source
Pour les chaînes, vous pouvez juste après le traitement de la chaîne. Pour les docstrings, vous devez à la place traiter la fonction. Voici une solution pour les deux qui est toujours lisible.
la source
inspect.cleandoc
- qui le font de la bonne façon.J'ai un problème similaire, le code est devenu vraiment illisible en utilisant les multilignes, je suis sorti avec quelque chose comme
oui, au début, cela pouvait sembler terrible, mais la syntaxe intégrée était assez complexe et ajouter quelque chose à la fin (comme '\ n "') n'était pas une solution
la source
Vous pouvez utiliser cette fonction trim_indent .
Résultat:
la source