В экосистеме Python есть множество библиотек для решения этих проблем
Одна из них SymPy
Код может выглядеть так:
import sympy
def solve_svt_equation(v=None, t=None, s=None):
velocity, space, time = sympy.symbols("v s t")
expr = velocity * time - space
if v:
expr = expr.subs(velocity, v)
if t:
expr = expr.subs(time, t)
if s:
expr = expr.subs(space, s)
return sympy.solve(expr)
print(solve_svt_equation(v=10, t=2)) # [20]
print(solve_svt_equation(s=2, t=7)) # [2/7], sympy defaults to rational numbers
print(solve_svt_equation(s=2, t=7, v=1)) # [], no solution
print(solve_svt_equation(s=2)) # [{t: 2/v}], symbolic solution for t
Альтернативой, которую было бы проще обобщить, может быть:
def solve_svt_equation(v=None, t=None, s=None):
velocity, space, time = sympy.symbols("v s t")
expr = velocity * time - space
vals = {velocity: v, space: s, time: t}
for symbol, val in vals.items():
if val:
expr = expr.subs(symbol, val)
return sympy.solve(expr)
Если вы хотите сгенерировать выражение из строки, вы можете сделать что-то очень похожее на ваш пример, используя sympy. parsing.sympy_parser.parse_expr
svt_expr = sympy.parsing.sympy_parser.parse_expr("v*t - s")
svt_expr = svt_expr.subs("s", 12)
svt_expr = svt_expr.subs("v", 6)
print(sympy.solve(svt_expr, "t")) # [2]
Еще одна отличная библиотека - z3 , это решатель SMT вместо библиотеки манипуляций с символами c, но может легко решить эти простые проблемы . Я бы посоветовал использовать sympy, если у вас есть символьные c уравнения, просто показывая их как альтернативу
import z3
v, s, t = z3.Reals("v s t")
equation = v * t == s
z3.solve([equation, s == 12, v == 6]) # Prints [v = 6, s = 12, t = 2]