8
votes

Comment transmettre une variable à un rappel RE2?

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: xxx

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?

Merci beaucoup.


0 commentaires

4 Réponses :


1
votes

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})


0 commentaires

15
votes

Le moyen le plus simple que je suppose est d'utiliser functools.Partial , ce qui vous permet de créer une fonction "partiellement évaluée": xxx


2 commentaires

Juste une note: si vous inverserez l'ordre du arguments , vous pouvez simplement dire partiel (évaluer, mappages) .


Oui, mais j'ai utilisé l'ordre d'argumentation exprès depuis que cela me semble plus naturel de définir évaluer () de cette façon et je voulais démontrer la flexibilité de partielle () .



2
votes

Vous pouvez créer une fermeture. xxx

puisque f est juste une seule déclaration, vous pouvez simplement utiliser lambda : xxx


0 commentaires

0
votes

La variante que je recommanderais: xxx

I.e. Il suffit de mettre le def évaluer (..) juste avant le sub () , sous forme de fonction locale.


1 commentaires

Vous pouvez lire à partir d'une variable prédéfinie, mais vous ne pouvez pas modifier la variable.