
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)
