Utility types for Python, such as `Result`, `Option`, etc.
Project description
📦 typeric
typeric is a practical type utility toolkit for Python, focused on clarity, safety, and ergonomics. It was originally built to make my own development experience smoother, but I hope it proves useful to others as well.
It currently provides lightweight, pattern-matchable types like Result and Option — inspired by Rust — with plans to include more common type patterns and error-handling abstractions.
pip install typeric
🚀 Features
- ✅ Functional-style
Resulttype:Ok(value)andErr(error), and you can spread(like?in Rust) or combine them. - 🌀 Lightweight
Optiontype:Some(value)andNONE - 🧩 Pattern matching support (
__match_args__) - 🔒 Immutable with
.map()/.map_err()/.unwrap()/.unwrap_or()helpers - 🔧 Clean type signatures:
Result[T, E]andOption[T] - 🛠️ Built for extensibility — more type tools coming
🔍 Quick Example
Result
from typeric.result import Result, Ok, Err
def parse_number(text: str) -> Result[int, str]:
try:
return Ok(int(text))
except ValueError:
return Err("Not a number")
match parse_number("42"):
case Ok(value):
print("Parsed:", value)
case Err(error):
print("Failed:", error)
def func_a(x: int) -> Result[int, str]:
if x < 0:
return Err("negative input")
return Ok(x * 2)
@spreadable
def func_b(y: int) -> Result[int, str]:
a = func_a(y).spread()
return Ok(a + 1)
def test_func_b_success():
assert func_b(5) == Ok(11) # 5*2=10 +1=11
def test_func_b_propagate_error():
assert func_b(-2) == Err("negative input")
def validate_username(username: str) -> Result[str, str]:
if username.strip():
return Ok(username)
return Err("Username is empty")
def validate_age(age: int) -> Result[int, str]:
if age > 0:
return Ok(age)
return Err("Age must > 0")
def validate_email(email: str) -> Result[str, str]:
if "@" in email:
return Ok(email)
return Err("Invalid email")
# ✅ results combine
def validate_user_data(
username: str, age: int, email: str
) -> Result[tuple[tuple[str, int], str], str]:
return (
validate_username(username)
.combine(validate_age(age))
.combine(validate_email(email))
)
result1 = validate_user_data("alice", 30, "alice@example.com")
print(result1) # Ok((('alice', 30), 'alice@example.com'))
result2 = validate_user_data("", -5, "invalid-email")
print(result2.errs) # Err(['Username is empty', 'Age must > 0', 'Invalid email'])
Option
from typeric.option import Option, Some, NONE
def maybe_get(index: int, items: list[str]) -> Option[str]:
if 0 <= index < len(items):
return Some(items[index])
return NONE
match maybe_get(1, ["a", "b", "c"]):
case Some(value):
print("Got:", value)
case NONE:
print("Nothing found")
✅ Test
Run tests with:
uv run pytest -v
📦 Roadmap
Validatedtype for batch error collection- Async
Result OptionResultcombinatorsTry,Either,NonEmptyList, etc.
📄 License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file typeric-0.1.5.tar.gz.
File metadata
- Download URL: typeric-0.1.5.tar.gz
- Upload date:
- Size: 27.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2947adf7d1eff362f533e084958e91163e8f5aecb070d6b51c4569c94989d25a
|
|
| MD5 |
04db92319490d0277f91b2dac4c26cbf
|
|
| BLAKE2b-256 |
111487f3be8e3c6d13d4d712140f15958c8516695ef6aa37f5c98b7e54e906c6
|
File details
Details for the file typeric-0.1.5-py3-none-any.whl.
File metadata
- Download URL: typeric-0.1.5-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ad7ac1a4a1f51655cf02748d5daa5c153c83134a4e65f47305aa11c7bcfeaf4
|
|
| MD5 |
ef00a81cca998c8853dfaa0a77b7a3f4
|
|
| BLAKE2b-256 |
f55027def2d55c6506c5721aa7acb4688a525e0fea444b25d3116164f773bd33
|