Dynamiquement l'évaluation simple de la logique booléenne en Python
J'ai quelques générées dynamiquement la logique booléenne expressions, comme:
- (A ou B) et (C ou D)
- A ou (A et B)
- Un
- vide - True
Les espaces remplacés par des booléens. Devrais-Je,
- Convertir cette information à une expression Python comme
True or (True or False)
eteval
? - Créer un arbre binaire où un nœud est soit un
bool
ouConjunction
/Disjunction
objet et de manière récursive l'évaluer? - Convertir en imbriquée S-expressions Lisp analyseur?
- Quelque chose d'autre?
Suggestions bienvenue.
OriginalL'auteur a paid nerd | 2010-03-18
Vous devez vous connecter pour publier un commentaire.
Il ne devrait pas être difficile à écrire un évaluateur qui peut gérer cela, par exemple à l'aide de pyparsing. Vous n'avez que quelques opérations à manipuler (et, ou, et le groupement?), donc, vous devriez être en mesure d'analyser et d'évaluer vous-même.
Vous ne devriez pas explicitement la forme de l'arbre binaire pour évaluer l'expression.
Je suis prêt à accepter cette réponse, car il n'est pas aussi largement terrifiante que
eval()
et c'est le plus facilement extensible.La réponse est maintenant invalide,
wikispaces.com
est mort.OriginalL'auteur Mike Graham
Voici une petite (peut-être, 74 lignes, y compris les espaces) module que j'ai construit en environ une heure et demi (plus près d'une heure de refactoring):
Les tests simples pour donner:
[Partiellement hors-sujet éventuellement]
Note, vous pouvez facilement configurer les jetons (les deux opérandes et d'opérateurs) que vous utilisez avec les pauvres-mans injection de dépendance des moyens fournis (
token_to_char=token_to_char
et amis) à plusieurs évaluateurs en même temps (réinitialisation de la "injecté par défaut" globals vous laisse avec un seul comportement).Par exemple:
donne:
nested_bool_eval
échouera si vous n'avez pas réellement en mesure d'effectuer toute opération, c'est à dire,nested_bool_eval("True")
(ou Faux).Graham Ah, j'ai oublié ce cas, la correction, merci 🙂
Ce qui est inquiétant est impressionnant. (applaudissements)
payé nerd Toujours les bienvenus! :))
il échoue lors de l'utilisation
False or False or True
parce qu'il n'a pas de parent et est retourné dansif not has_parens: return self.bool_eval(token_list)
python évalue cette expression correctement:>>> False or False or True ---> True
OriginalL'auteur mlvljr
Si vous configurez dicts avec les habitants et les globals se soucient de vous, alors vous devriez être en mesure de passer en toute sécurité avec l'expression en
eval()
.eval
ici; vous avez seulement besoin d'évaluer un langage très simple, pas de Python. (En outre, la limitation de ce que vous transmettez àeval
pour les variables locales/globales n'est pas sûr si vous avez envie de passer beaucoup à tous, et certainement ne les empêche pas de très gros calculs.)+1: il suffit de créer un dictionnaire et d'utiliser la fonction eval.
OriginalL'auteur Ignacio Vazquez-Abrams
Sonne comme un morceau de gâteau à l'aide de SymPy module logique. Ils ont même un exemple de ce sur les docs: http://docs.sympy.org/0.7.1/modules/logic.html
OriginalL'auteur Shnatsel