Wie ich gerade sehe, gibt es einen Bug in parser-Funktion, da / eine höhere Priorität hat als *. Dass das Paket unnötige Klammern einführt, macht es nicht wirklich geeignet.
Dann hast Du noch besondere Anforderungen, dass Du Kommazahlen möchtest und mit Rest rechnen möchtest.
Als erstes muß also die `parser`-Methode gepatcht werden:
Code: Alles auswählen
def isOperator(self):
ops = (
('**', 8, '**'),
('^', 8, '^'),
('%', 5, '%'),
('/', 5, '/'),
('*', 5, '*'),
('+', 4, '+'),
('-', 4, '-'),
)
for token, priority, index in ops:
if self.expression.startswith(token, self.pos):
self.tokenprio = priority
self.tokenindex = index
self.pos += len(token)
return True
return False
Parser.isOperator = isOperator
parser = Parser()
parser.ops2['/'] = divmod
Code: Alles auswählen
text = "Wie viele {a}cm lange Stücke kann man von einer {b}m langen Leiste absägen?"
ergebnis = "100*{b} / {a}"
variablen_auswahl = {"a": [5,10,15,20,25], "b": [1,1.2,1.5,2,2.5]}
Code: Alles auswählen
variablen = {
name: random.choice(werte)
for name, werte in variablen_auswahl.items()
}
variablen_text = {
name: str(wert).replace('.', ',')
for name, wert in variablen.items()
}
Code: Alles auswählen
print(text.format(**variablen_text))
Code: Alles auswählen
loesungs_weg = ergebnis.format(**variablen_text)
wert = parser.evaluate(ergebnis.format(**{k: k for k in variablen}), variablen)
if isinstance(wert, tuple):
wert, rest = wert
if rest:
print(f"Lösung: {loesungs_weg} = {wert:.0f} Rest {rest:.0f}")
else:
print(f"Lösung: {loesungs_weg} = {wert:.0f}")
else:
print(f"Lösung: {loesungs_weg} = {wert}")
Hier wird als erstes in der `ergebnis`-Variable die Platzhalter durch ihren Namen ersetzt, um den Ausdruck parsen zu können.
Beispiel:
Code: Alles auswählen
Wie viele 20cm lange Stücke kann man von einer 2,5m langen Leiste absägen?
Lösung: 100*2,5 / 20 = 12 Rest 10