Skip to main content

Library for optimizing enum constant values

Project description

microconst

pypi python typed tests license

Replace long constant names with 2 ASCII characters

Installation

pip:

pip install microconst

poetry:

poetry add microconst

Features

Constants

Every call of flag or key generates 2-character constant. This constant is represented as left and right indexes of f"{ascii_letters}{digits}" str. Each time the left index reaches cap, it resets to 0 and right index increments.
After reaching both of caps, next call of function will throw OverflowError. Current maximum count of constants is 3844.

Typing

key function requires value_type argument, such as str, int etc. This type used in both static analysis and type conversion with Key.parse_entry function.

Examples

Main purpose of this library is making telegram bot's "callback_data" much more compact because of 64-byte limit. You can see more realistic example here

Flag usage

Before:

from enum import StrEnum, auto

# Some very strict limit
MAX_LEN: int = 4

class Status(StrEnum):
    PENDING = auto()
    APPROVED = auto()
    REJECTED = auto()

assert Status.PENDING == "pending"
assert len(Status.PENDING) > MAX_LEN  # Too long

After:

from microconst import flag

MAX_LEN: int = 4

# Autogenerates unique pairs of characters
class Status:
    PENDING = flag()
    APPROVED = flag()
    REJECTED = flag()

assert Status.PENDING == "aa"
assert len(Status.PENDING) < MAX_LEN 

Key usage

Before:

from enum import StrEnum, auto

class Data(StrEnum):
    USERNAME = auto()
    ORDER = auto()

# You should use separator because of varying character count in key
username = Data.USERNAME + ":" + "name"
assert username == "username:name"  # Too long

value = username.split(":")[1]
assert value == "name"

order = Data.ORDER + ":" + str(1337)
assert order == "order:1337"

# Order doesnt contain its type anywhere, so you should convert types each time
assert int(order.split(":")[1]) == 1337

After:

from microconst import key, parse_entry

class Data:
    USERNAME = key(str)
    ORDER = key(int)

# You can call keys to create key-value pair (acts same as concat)
username = Data.USERNAME("name")
assert username == "aaname"

# Getting value
value = Data.USERNAME.parse_entry(username)
assert value == "name"

order = Data.ORDER(1337)
assert order == "ba1337"

# You can use separate function or method. Method doesnt require type argument
assert parse_entry(order, int) == 1337
assert Data.ORDER.parse_entry(order) == 1337

Key usage (literals)

Unique feature, it's hard to implement, so no comprasion before and after:

from microconst import key, parse_entry

class Data:
    ORDER = key(Literal[1, 2, 3])

assert Data.ORDER(1) == "aa1"
# assert Data.ORDER(4) == "aa4"  # Mypy error

assert Data.ORDER.parse_entry("__3") == 3
# assert Data.ORDER.parse_entry("__10") == 10  # Mypy error

License

MIT

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

microconst-0.2.0.tar.gz (5.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

microconst-0.2.0-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

Details for the file microconst-0.2.0.tar.gz.

File metadata

  • Download URL: microconst-0.2.0.tar.gz
  • Upload date:
  • Size: 5.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for microconst-0.2.0.tar.gz
Algorithm Hash digest
SHA256 2d28f70bc50e0bc5576712533b4334413a3b1849a7be7ec97e7f892590b457c8
MD5 e4d24c4a2b2e293600d1e1191956b7da
BLAKE2b-256 7e46fc9ad55c10fbdf4ba0a7ac630d6274999b8b482fe2783b47430bfd48856b

See more details on using hashes here.

File details

Details for the file microconst-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: microconst-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 5.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for microconst-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a0f25830e145ee45c5bfda275f77d3265d3941d28e3907aabac7345dc0afbe3
MD5 9ffb0e3857f6fd300812764a0107ed8a
BLAKE2b-256 1015e5f2d6301feac4c02581f024c117dfa55844f77972232361c0c59313e023

See more details on using hashes here.

Supported by

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