J'utilise un rappel RE2 pour remplacer les sous-chaînes avec des valeurs aléatoires, mais je voudrais que les valeurs aléatoires soient les mêmes sur différentes chaînes. Étant donné que le rappel Re4 n'autorise pas les arguments, je ne sais pas comment faire cela.
Voici une version simplifiée de ce que je fais: p> Maintenant, comme il se trouve, les chaînes seront correctement évaluées: Newstring_one est "1 + 2" et Newstring_two est "3". Mais je veux pouvoir choisir les valeurs au hasard au hasard et les avoir toujours remplacés dans les deux cordes. Cela impliquerait la suppression de la ligne «mappages» dans «évaluer» et utiliserait quelque chose comme les deux lignes commentées. Comment, cependant, puis-je obtenir mes maples de choisi au hasard2 pour être utilisées lors de l'évaluation des deux chaînes, si je ne peux pas la transmettre comme un argument dans la fonction de rappel Re -SUB? P> Merci beaucoup. p> p>
4 Réponses :
Vous pouvez utiliser un objet de fonction.
class A(object): def __init__(self, mappings): self.mappings = mappings def __call__(self, match): return str(eval(match.group(0)[2:-1], self.mappings)) evaluate = A({'A': 1, 'B': 2})
Le moyen le plus simple que je suppose est d'utiliser functools.Partial code>, ce qui vous permet de créer une fonction "partiellement évaluée":
Juste une note: si vous inverserez l'ordre du code> arguments code>, vous pouvez simplement dire partiel (évaluer, mappages) code>.
Oui, mais j'ai utilisé l'ordre d'argumentation exprès depuis que cela me semble plus naturel de définir évaluer () code> de cette façon et je voulais démontrer la flexibilité de
partielle () code>.
Vous pouvez créer une fermeture. puisque f code> est juste une seule déclaration, vous pouvez simplement utiliser
lambda code>: p>
La variante que je recommanderais: I.e. Il suffit de mettre le def évaluer (..) code> juste avant le
sub () code>, sous forme de fonction locale. p> p>
Vous pouvez lire à partir d'une variable prédéfinie, mais vous ne pouvez pas modifier la variable.