Automatic registry design-pattern for mapping names to functionality.
Project description
AutoRegistry
Invoking functions and class-constructors from a string is a common design pattern that AutoRegistry aims to solve. For example, a user might specify a backend of type "sqlite" in a yaml configuration file, for which our program needs to construct the SQLite subclass of our Database class. Classically, you would need to manually create a lookup, mapping the string "sqlite" to the SQLite constructor. With AutoRegistry, the lookup is automatically created for you.
AutoRegistry has a single powerful class Registry that can do the following:
Be inherited to automatically register subclasses by their name.
Be directly invoked my_registry = Registry() to create a decorator for registering callables like functions.
Traverse and automatically create registries for other python libraries.
AutoRegistry is also highly configurable, with features like name-schema-enforcement and name-conversion-rules. Checkout the docs for more information.
Installation
AutoRegistry requires Python >=3.8.
python -m pip install autoregistry
Examples
Class Inheritance
Registry adds a dictionary-like interface to class constructors for looking up subclasses.
from abc import abstractmethod
from dataclasses import dataclass
from autoregistry import Registry
@dataclass
class Pokemon(Registry):
level: int
hp: int
@abstractmethod
def attack(self, target):
"""Attack another Pokemon."""
class Charmander(Pokemon):
def attack(self, target):
return 1
class Pikachu(Pokemon):
def attack(self, target):
return 2
class SurfingPikachu(Pikachu):
def attack(self, target):
return 3
print(f"{len(Pokemon)} Pokemon types registered:")
print(f" {list(Pokemon)}")
# By default, lookup is case-insensitive
charmander = Pokemon["cHaRmAnDer"](level=7, hp=31)
print(f"Created Pokemon: {charmander}")
This code block produces the following output:
3 Pokemon types registered:
['charmander', 'pikachu', 'surfingpikachu']
Created Pokemon: Charmander(level=7, hp=31)
Function Registry
Directly instantiating a Registry object allows you to register functions by decorating them.
from autoregistry import Registry
pokeballs = Registry()
@pokeballs
def masterball(target):
return 1.0
@pokeballs
def pokeball(target):
return 0.1
for ball in ["pokeball", "masterball"]:
success_rate = pokeballs[ball](None)
print(f"Ash used {ball} and had {success_rate=}")
This code block produces the following output:
Ash used pokeball and had success_rate=0.1
Ash used masterball and had success_rate=1.0
Module Registry
Create a registry for another python module.
import torch
from autoregistry import Registry
optims = Registry(torch.optim)
# "adamw" and ``lr`` could be coming from a configuration file.
optimizer = optims["adamw"](model.parameters(), lr=3e-3)
assert list(optims) == [
"asgd",
"adadelta",
"adagrad",
"adam",
"adamw",
"adamax",
"lbfgs",
"nadam",
"optimizer",
"radam",
"rmsprop",
"rprop",
"sgd",
"sparseadam",
"lr_scheduler",
"swa_utils",
]
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
File details
Details for the file autoregistry-1.1.2.tar.gz
.
File metadata
- Download URL: autoregistry-1.1.2.tar.gz
- Upload date:
- Size: 14.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.12.0 Linux/6.2.0-1016-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c74147a6492184a9b03a02f16f90bd080eb62d174dec2a9e79e3fd10bbef818f |
|
MD5 | 87924e00636255ef4abd0964be1d1ff6 |
|
BLAKE2b-256 | 5dbcf7966c6c90748b6746fb0734116ad5a0ee9a8644c687ebed4ce0656f7ce9 |
File details
Details for the file autoregistry-1.1.2-py3-none-any.whl
.
File metadata
- Download URL: autoregistry-1.1.2-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.12.0 Linux/6.2.0-1016-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | afeb178bfe386c832c155c1aeae0de4d389a796cee964d8861b81fc5b4681f95 |
|
MD5 | a7e30eace99f440482a3ef32a994211c |
|
BLAKE2b-256 | 6577ffbe51fd4594ac4ff714453dcbe232a59865e864e86443f4ba10bc2b83b5 |