Skip to main content

A typing based dispatching library.

Project description

Nightjar

PyPI version PyPI - Downloads PyPI - Python Version GitHub

Description

This project is a Python package that provides a simple way to create objects of different types based on a configuration object. The package is inspired by how huggingface/transformers package creates different types of models based on a configuration object. The package provides a base class BaseModule that can be subclassed to create different class types. Each class type is defined by a configuration class that inherits from BaseConfig. The AutoModule class is used to automatically create instances of the correct object type based on the configuration. The dispatch attribute of the configuration class is used to specify the static attribute that determines the object type.

Installation

To install this package, run the following command:

pip install nightjar

Usage

Example

Let's see the usage of this package with an example.

from typing import ClassVar

from nightjar import AutoModule, BaseConifg, BaseModule


class VehicleConfig(BaseConifg, dispatch=["type"]):
    type: ClassVar[str]


class Vehicle(BaseModule):
    config: VehicleConfig


class AutoVehicle(AutoModule):
    def __new__(cls, config: VehicleConfig) -> Vehicle:
        return super().__new__(cls, config)


class CarConfig(VehicleConfig):
    type: ClassVar[str] = "car"


class Car(Vehicle):
    config: CarConfig


class VanConfig(VehicleConfig):
    type: ClassVar[str] = "van"


class Van(Vehicle):
    config: VanConfig

Explanation

classDiagram
    class BaseConfig {
        <<abstract>>
        +dispatch: ClassVar[str | List[str]]
        +from_dict(cls, data: Dict[str, Any]) -> BaseConfig
        +to_dict(self) -> Dict[str, Any]
    }
    class BaseModule {
        <<abstract>>
        +config: BaseConfig
    }
    class AutoModule {
        +__new__(cls, config: BaseConfig) -> BaseModule
    }
    class VehicleConfig {
        +type: ClassVar[str]
    }
    class Vehicle {
        +config: VehicleConfig
    }
    class AutoVehicle {
        +__new__(cls, config: VehicleConfig) -> Vehicle
    }
    class CarConfig {
        +type: ClassVar[str] = "car"
    }
    class Car {
        +config: CarConfig
    }
    class VanConfig {
        +type: ClassVar[str] = "van"
    }
    class Van {
        +config: VanConfig
    }
    BaseConfig <|-- VehicleConfig
    BaseModule <|-- Vehicle
    AutoModule <|-- AutoVehicle
    VehicleConfig <|-- CarConfig
    VehicleConfig <|-- VanConfig
    Vehicle <|-- Car
    Vehicle <|-- Van

This package provides a base class BaseModule that can be subclassed to create different types of objects. Each object type is defined by a configuration class that inherits from BaseConfig. The AutoModule class is used to automatically create instances of the correct object type based on the configuration. The dispatch attribute of the configuration class is used to specify the static attribute that determines the object type.

AutoModule is a generic class that takes the configuration object as init argument and returns an instance of the correct object type. The __new__ method is used to create the correct object type based on the configuration. It is not necessary to define the __new__ method in the subclass of AutoModule or to subclass AutoModule at all. The AutoModule class can be used directly to create instances of the correct object type. However, subclassing AutoModule can be useful to add additional functionality or to customize the creation of objects and for type hinting.

# use from_dict method to create a configuration object from a dictionary this will automatically create the correct jar config.
config = VehicleConfig.from_dict({"type": "car"})
# Now you can create a car object using the configuration object with Auto* object
car = AutoVehicle(config)
# Now you can access the config object
assert car.config.type == "car", f"expected 'car', got '{car.config.type}'"

You could use AutoJar, Jar, JarConfig instead of AutoModule, BaseModule, BaseConfig respectively if you prefer.

License

Please see the MIT License file for details.

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

nightjar-0.0.5.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

nightjar-0.0.5-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

Details for the file nightjar-0.0.5.tar.gz.

File metadata

  • Download URL: nightjar-0.0.5.tar.gz
  • Upload date:
  • Size: 9.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.5

File hashes

Hashes for nightjar-0.0.5.tar.gz
Algorithm Hash digest
SHA256 2504acf120992e8707aee1168a9a8bd6ec9b5ddad27c98561ec78c608f0f00c5
MD5 f5f6af0f2247345e635ec8d9289f5471
BLAKE2b-256 76483d7ea4e0e3e4dbe9e2e3f5d42c0adf53e8b8a72c928b356402fe54f7bfc1

See more details on using hashes here.

File details

Details for the file nightjar-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: nightjar-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 8.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.5

File hashes

Hashes for nightjar-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 0d2f4d6a38a7ea82ce4f581c62195ab41b02322e445e8859598c9a0c9e90668a
MD5 b34650572092bc52944284afb4ecc5b7
BLAKE2b-256 637efdf781640c61fc75c9a93ba38d1fca4404ee44637a0df35a94cfc4603c1a

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