8
votes

Formulaire court pour string.format (..., ** locaux ())

J'utilise habituellement le motif suivant (comme mentionné dans cette question ): xxx

Je pense que c'est un excellent moyen d'écrire un code facilement lisible.

Parfois, il est utile de" chaîner "formats de chaîne , afin de "modulariser" la création de chaînes complexes: xxx p> joli bientôt, le code est harcelé avec x.format (** locaux ()) < / code>. Pour résoudre ce problème, j'ai essayé de créer une Lambda: xxx

mais cela jette un keerror, car locaux () sont les locaux de la Lambda. < / P>

J'ai également essayé d'appliquer le format uniquement sur la dernière chaîne: xxx

mais cela ne fonctionne pas, car Python ne fonctionne que une fois. Maintenant, je pourrait écrire une fonction qui formate à plusieurs reprises jusqu'à ce qu'il n'y ait rien de plus à faire: xxx

mais je me demande: y a-t-il une meilleure façon faire cela?


0 commentaires

4 Réponses :


4
votes

f = lambda x, l = locaux (): x.format (** l) semble fonctionner ...

Et si vous vouliez une version qui est un peu plus tout -Compassing (et probablement beaucoup plus lentement): xxx

trouvera les symboles dans les locaux ou les globaux.


1 commentaires

Vous voulez probablement que les habitants puissent remplacer les globaux. Actuellement, vous en avez l'inverse, puisque les arguments plus tard, des arguments à la victoire de Dict.



0
votes

Ce n'est pas une doublure, mais cela fonctionne:

fmt = lambda s, l=locals(): fmt(s.format(**l), l=l) if '{' in s else s


0 commentaires

2
votes

Si vous n'avez besoin que de le faire dans la portée de la fonction sous forme de raccourci local, les éléments suivants fonctionnent: xxx

Cependant, cela liera la valeur renvoyée par locaux () au moment de la déclaration de fonction plutôt que sur l'exécution, il ne sera donc pas mis à jour car les valeurs changent, ni utile quand appelé à partir d'une autre portée.

Si vous voulez avoir accès à la méthode d'appel de la méthode de l'appel, , vous devez inspecter la pile d'appels ( http://docs.python.org/2/library/inspect.html ) xxx

Notez que cela peut ne pas fonctionner Pour les implémentations de python qui ne sont pas cpython.

maintenant, vous pouvez faire: xxx


1 commentaires

En fait, c'est vrai parfois, mais pas toujours ... il ressemble à des locaux () renvoie réellement un pointeur à la valeur dict des «locaux», qui semble changer. Vous pouvez faire les expériences suivantes: f = locaux (); x = 1; g = locaux (); f == g , qui sera vrai, même si vous avez modifié une valeur locale entre F et g. Aussi: def fn (x, l = locaux ()): impression L [x]; x = 2; fn ('x'); x = 3; Fn ('x') imprimera 2, puis 3. Il semble que cela devrait être vrai parfois, c'est donc un bon commentaire, mais il semble y avoir beaucoup de cas pratiques où vous pouvez l'ignorer.



1
votes

commençant par Python 3.6 L'effet de ** locaux () est déjà inclus dans fichier # format ou plutôt "littéraux de chaînes formatés".

Voir aussi Pep 498 et Notes de publication Python 3.6 .


0 commentaires