def from_expr(cls, expr: sp.Basic) -> Quantity: """ Converts a Sympy expression with unit symbols into a Quantity. This only works in case expression *only* contains base SI unit symbols. """ _dimension_symbol_map = cls.get_dimension_symbol_map() expr = expr.simplify() args = expr.args if not args: return cls(float(expr), 'dimensionless') try: magnitude = float(args[0]) except TypeError as e: raise ValueError( f'Expression {expr} contains inconsistent units') from e dimensions = args[1:] unit = cls.get_unit('') for d in dimensions: unit_i = cls.get_unit('') for symbol, power in d.as_powers_dict().items(): unit_i *= _dimension_symbol_map[symbol]**power unit *= unit_i return cls(magnitude, unit).to_base_units()