pip install typed-input uv add typed-input Each function has this structure:
<type>_input( prompt: str | None = None, min_value: <type> | None = None, max_value: <type> | None = None, default_value: <type> | None = None, type_error_message: str | None = None, ) -> <type>prompt: (Optional) Message displayed to the user when prompting for input.min_value/max_value: (Optional) Bounds for input validation.default_value: (Optional) Value returned if no input is provided. Must fall within bounds.type_error_message: (Optional) Error message shown when input cannot be converted to expected type. Defaults are provided for each function.
| Function | Default type_error_message |
|---|---|
int_input | Error: You must enter a valid integer. |
float_input | Error: You must enter a valid float. |
decimal_input | Error: You must enter a valid Decimal. |
datetime_input | Error: You must enter a valid datetime in valid ISO 8601 format e.g. YYYY-MM-DD. See documentation for all allowed options. |
The typed_input library is designed to feel natural for Python developers by supporting the same API as the standard input() function.
Example Usage (like input())
>>> from typed_input import int_input >>> x = int_input() a Error: You must enter a valid integer. 42 >>> type(x) <class 'int'> >>> x 42 >>> from typed_input import float_input >>> x = float_input() 3.14 >>> type(x) <class 'float'> >>> from typed_input import decimal_input >>> x = decimal_input() 1.45 >>> type(x) <class 'decimal.Decimal'> >>> from typed_input import datetime_input >>> dt = datetime_input() 2024-01-01 >>> type(dt) <class 'datetime.datetime'>Just like input(), you can also pass a prompt to guide the user:
>>> from typed_input import int_input >>> int_input('Enter a number: ') Enter a number: 7 7This compatibility makes typed_input a drop-in replacement for input() in many scenarios, with the added benefit of type safety and validation!
>>> from typed_input import int_input >>> int_input(prompt="Enter a number (1-10): ", min_value=1, max_value=10) Enter a number (1-10): abc Error: You must enter a valid integer. Enter a number (1-10): 20 Error: Value must be between 1 and 10. Enter a number (1-10): 5 5>>> from typed_input import float_input >>> float_input(prompt="Enter a temperature (-50 to 50): ", min_value=-50.0, max_value=50.0) Enter a temperature (-50 to 50): Error: You must enter a valid float. Enter a temperature (-50 to 50): 100 Error: Value must be between -50.0 and 50.0. Enter a temperature (-50 to 50): 22.5 22.5>>> from typed_input import decimal_input >>> from decimal import Decimal >>> decimal_input(prompt="Enter a price (min 0.01): ", min_value=Decimal("0.01")) Enter a price (min 0.01): -10 Error: Value must be at least 0.01. Enter a price (min 0.01): 19.99 Decimal('19.99')>>> from typed_input import datetime_input >>> from datetime import datetime >>> datetime_input(prompt="Enter a date (YYYY-MM-DD): ", min_value=datetime(2023, 1, 1)) Enter a date (YYYY-MM-DD): invalid Error: You must enter a valid datetime in ISO 8601 format (e.g., YYYY-MM-DD). Enter a date (YYYY-MM-DD): 2022-12-31 Error: Date must be on or after 2023-01-01. Enter a date (YYYY-MM-DD): 2023-01-15 datetime.datetime(2023, 1, 15, 0, 0)All functions raise a ValueError for:
- Invalid Range:
min_value > max_value. - Default Out of Bounds:
default_valueoutsidemin_value/max_value.
Example:
>>> int_input(min_value=10, max_value=5) Traceback (most recent call last): ... ValueError: min_value (10) cannot be greater than max_value (5).- Run formater:
uv run ruff check --select I --fix && uv run ruff format
- Run type checking:
uv run mypy .
- Run all unit tests:
uv run typed_input_test.py
- Run specific unit test:
uv run python -m unittest int_input_test.py
