Skip to main content

Pythonic Java optional

Project description

Maypy is python implementation of the well known Java Optional 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

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:

from maypy import Maybe

assert Maybe.empty().is_empty()
assert Maybe.of(None).is_empty()
assert Maybe.of("value").is_present()

Using chaining operation over wrapped value:

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:

from dataclasses import dataclass
from enum import StrEnum, unique

from maypy import 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.of(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"))

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

maypy-1.1.2.tar.gz (9.6 kB view details)

Uploaded Source

Built Distribution

maypy-1.1.2-py3-none-any.whl (8.7 kB view details)

Uploaded Python 3

File details

Details for the file maypy-1.1.2.tar.gz.

File metadata

  • Download URL: maypy-1.1.2.tar.gz
  • Upload date:
  • Size: 9.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.9.20 Linux/6.5.0-1025-azure

File hashes

Hashes for maypy-1.1.2.tar.gz
Algorithm Hash digest
SHA256 103fbbd65af250a546e061083c2ba433ca10575ec0e92412a868313c0fa262e2
MD5 10e7ca5503964ba7f406d2b604937fc1
BLAKE2b-256 511de977b41b2b35a55b2c3ed7581a3179931700d08b2f4dc97f0ee74e4bb939

See more details on using hashes here.

File details

Details for the file maypy-1.1.2-py3-none-any.whl.

File metadata

  • Download URL: maypy-1.1.2-py3-none-any.whl
  • Upload date:
  • Size: 8.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.9.20 Linux/6.5.0-1025-azure

File hashes

Hashes for maypy-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 963c8ed36b3c46d4d87d60380f79d3fc3cf4b82c2e08af728c303729a84ea9f8
MD5 11685abd49a54bd25b6a24ddb2c510f3
BLAKE2b-256 d636daf9581d4da4f842242d49a78f92b0df7ddd53156ec42e3f1890ff0f2cc2

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page