--- kf_02-27T08-43-03-067303.py +++ kf_03-02T15-25-10-840374.py @@ -1 +1,65 @@ +class Name: + def __init__(self, name: str): + self.name = str(name) +class Symbol: + def __init__(self, symbol: str): + self.symbol = str(symbol) +class Unit: + def __init__(self, name: Name, symbols: list[Symbol]): + if not isinstance(name, Name): + raise TypeError('name must be a Name instance.') + if not isinstance(symbols, list) or not symbols or any(not isinstance(symbol, Symbol) for symbol in symbols): + raise TypeError('symbols must be a non-empty list of Symbol instances.') + self.name = name + self.symbols = list(symbols) +meter_unit = Unit(name=Name('meter'), symbols=[Symbol('m')]) +centimeter_unit = Unit(name=Name('centimeter'), symbols=[Symbol('cm')]) +gram_unit = Unit(name=Name('gram'), symbols=[Symbol('g')]) +kilogram_unit = Unit(name=Name('kilogram'), symbols=[Symbol('kg')]) +class Value: + def __init__(self, number: float, unit: Unit): + if unit is None: + raise ValueError('unit is required.') + if not isinstance(unit, Unit): + raise TypeError('unit must be a Unit instance.') + self.number = float(number) + self.unit = unit + def convert_to(self, target_unit: Unit) -> 'Value': + if not isinstance(target_unit, Unit): + raise TypeError('target_unit must be a Unit instance.') + source_name = self.unit.name.name + target_name = target_unit.name.name + if source_name == target_name: + return Value(self.number, self.unit) + factor = unit_conversion_factors.get((source_name, target_name)) + if factor is None: + raise ValueError(f'No conversion from {source_name} to {target_name}.') + return Value(self.number * factor, target_unit) +class Distance: + def __init__(self, value: Value): + if not isinstance(value, Value): + raise TypeError('value must be a Value instance.') + if value.unit.name.name not in {'meter', 'centimeter'}: + raise ValueError('Distance only accepts meter or centimeter units.') + self.value = value +unit_conversion_factors: dict[tuple[str, str], float] = { + ('meter', 'centimeter'): 100.0, + ('centimeter', 'meter'): 0.01, + ('gram', 'kilogram'): 0.001, + ('kilogram', 'gram'): 1000.0, +} +def distance_validation_probe() -> dict[str, bool]: + value_requires_unit = False + distance_in_kg_rejected = False + distance_in_m_ok = False + try: + Value(5, None) + except ValueError: + value_requires_unit = True + try: + Distance(Value(2.0, kilogram_unit)) + except ValueError: + distance_in_kg_rejected = True + distance_in_m_ok = Distance(Value(2.0, meter_unit)).value.unit.name.name == 'meter' + return dict(value_requires_unit=value_requires_unit, distance_in_kg_rejected=distance_in_kg_rejected, distance_in_m_ok=distance_in_m_ok)