import math
from dataclasses import dataclass
@dataclass(frozen=True)
class CircleMetrics:
"""Immutable data container for circle measurements."""
diameter: float
circumference: float
area: float
def calculate_circle_metrics(radius: float) -> CircleMetrics:
"""
Calculates the diameter, circumference, and area of a circle.
Args:
radius (float): The radius of the circle (must be non-negative).
Returns:
CircleMetrics: An object containing the diameter, circumference, and area.
Raises:
TypeError: If the radius is not a numeric value.
ValueError: If the radius is negative.
"""
# Validate input type
if not isinstance(radius, (int, float)):
raise TypeError("Radius must be a numeric value.")
# Guard clause: radius cannot be negative
if radius < 0:
raise ValueError("Radius cannot be negative.")
diameter = 2.0 * radius
circumference = 2.0 * math.pi * radius
# Standard multiplication (radius * radius) is more efficient than radius ** 2
area = math.pi * (radius * radius)
return CircleMetrics(diameter=diameter, circumference=circumference, area=area)
# --- Example Usage ---
if __name__ == "__main__":
try:
radius = 3.0
# Retrieve calculated metrics
metrics = calculate_circle_metrics(radius)
# Output results formatted to 2 decimal places using f-strings
print(f"Radius: {radius}")
print(f"Diameter: {metrics.diameter}")
print(f"Circumference: {metrics.circumference:.2f}")
print(f"Area: {metrics.area:.2f}")
except (TypeError, ValueError) as error:
print(f"Error: {error}")
'''
run:
Radius: 3.0
Diameter: 6.0
Circumference: 18.85
Area: 28.27
'''