J'utilise habituellement le motif suivant (comme mentionné dans cette question ): Je pense que c'est un excellent moyen d'écrire un code facilement lisible. P> Parfois, il est utile de" chaîner "formats de chaîne , afin de "modulariser" la création de chaînes complexes: p> mais cela jette un keerror, car J'ai également essayé d'appliquer le format uniquement sur la dernière chaîne: p> mais cela ne fonctionne pas, car Python ne fonctionne que une fois.
Maintenant, je pourrait em> écrire une fonction qui formate à plusieurs reprises jusqu'à ce qu'il n'y ait rien de plus à faire: p> mais je me demande: y a-t-il une meilleure façon faire cela? p> p> x.format (** locaux ()) < / code>.
Pour résoudre ce problème, j'ai essayé de créer une Lambda: p>
locaux () code> sont les locaux de la Lambda. < / P>
4 Réponses :
Et si vous vouliez une version qui est un peu plus tout -Compassing (et probablement beaucoup plus lentement): p> trouvera les symboles dans les locaux ou les globaux. p> p> f = lambda x, l = locaux (): x.format (** l) code> semble fonctionner ...
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.
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
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: Cependant, cela liera la valeur renvoyée par Si vous voulez avoir accès à la méthode d'appel de la méthode de l'appel, code>, vous devez Notez que cela peut ne pas fonctionner Pour les implémentations de python qui ne sont pas cpython. p> maintenant, vous pouvez faire: p> locaux () code> 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. P>
inspecter code> la pile d'appels ( http://docs.python.org/2/library/inspect.html ) p>
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 code>, 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') code> 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.
commençant par Python 3.6 L'effet de Voir aussi Pep 498
et Notes de publication Python 3.6 . P> ** locaux () code> est déjà inclus dans
fichier # format code> ou plutôt "littéraux de chaînes formatés". P>