https://github.com/mletrone/maypy
Pythonic Java optional
https://github.com/mletrone/maypy
python python3 typed utils-library
Last synced: 9 months ago
JSON representation
Pythonic Java optional
- Host: GitHub
- URL: https://github.com/mletrone/maypy
- Owner: mLetrone
- License: mit
- Created: 2024-08-23T16:05:04.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2025-01-10T14:53:25.000Z (over 1 year ago)
- Last Synced: 2025-01-20T21:54:13.056Z (over 1 year ago)
- Topics: python, python3, typed, utils-library
- Language: Python
- Homepage: https://mletrone.github.io/maypy
- Size: 1.32 MB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
[](https://www.python.org/)



[](https://github.com/MLetrone/maypy/actions/workflows/check.yml)
---
Source Code: [https://github.com/MLetrone/maypy](https://github.com/MLetrone/maypy)
documentation: [https://mletrone.github.io/maypy](https://mletrone.github.io/maypy/)
---
Maypy is python implementation of the well known Java [Optional](https://docs.oracle.com/en%2Fjava%2Fjavase%2F11%2Fdocs%2Fapi%2F%2F/java.base/java/util/Optional.html) API.
It's designed to help you handle potential `None` values, reducing error from `NoneType`.
## Features :
- Brings functional programming
- Easy to use
- Fully typed and compatible with `mypy` !
- Lightweight
## installation
```shell
pip install maypy
```
That's all ! _Ready to use_
## Usage
### Description
It's not rare to handle return from function that _maybe_ either a value or None.
Like `.get` from a dictionary, results from api or ORM etc.
With no more `if value is None` with `MayPy`, encapsulate your value and do what you want to.
MayPy brings `Maybe` a wrapper (container), it is either **empty** if the value passed was `None` or valuated,
in this case it contains the value, and we can perform operation on it.
### Examples
Checking value presence:
```python
from maypy import Maybe, Empty, maybe
assert Empty().is_empty()
assert maybe(None).is_empty()
assert maybe("value").is_present()
```
Using chaining operation over wrapped value:
```python
from maypy import Maybe
from typing import List, Optional
def convert_to_celsius(fahrenheit: float) -> float:
return (fahrenheit - 32) * 5 / 9
fahrenheit_temperatures: List[Optional[float]] = [32.45, None, 26.6, 100, 72, None, 10]
for temp in fahrenheit_temperatures:
Maybe.of(temp).map(convert_to_celsius).filter(lambda celsius: celsius > 0)
```
Defining return from database result:
````python
from dataclasses import dataclass
from enum import StrEnum, unique
from maypy import Maybe, maybe
from pydantic import BaseModel
from sqlalchemy.orm import Session
@unique
class Gender(StrEnum):
MALE = "M"
FEMALE = "F"
UNKNOWN = "X"
@dataclass
class User:
id: str
email: str
gender: Gender
class UserEntity(BaseModel):
id: str
email: str
gender: str
class Config:
orm_mode = True
def get_user(db: Session, user_id: str) -> Maybe[User]:
return maybe(db.query(UserEntity).filter(UserEntity.id == user_id).first()).map(to_domain)
def to_domain(user_dto: UserEntity) -> User:
return User(
id=user_dto.id,
email=user_dto.email,
gender=Gender(user_dto.gender)
)
user = get_user(db, "481efz4x1d").or_else_raise(Exception("User id<481efz4x1d> not found"))
````