Skip to main content

parameterizable

PyPI version Python versions License: MIT Downloads Documentation Status Code style: pep8 Docstring Style: Google

Parameter manipulation for Python classes.

What Is It?

parameterizable provides functionality for work with parameterizable classes: those that have (hyper) parameters which define object's configuration, that is different from the object's internal contents or data. Such parameters are typically passed to the .__init__() method when an object is created.

parameterizable allows to:

  • Get parameters of an object as a dictionary.
  • Get default parameters of a class as a dictionary.
  • Serialize an object's parameters to a JSON string.
  • Recreate the object from its parameters, stored in a JSON string.

Why Is It Useful?

parameterizable is useful for developers working with configurable Python objects, especially in scenarios involving machine learning, scientific computing, or any domain where object's behavior is defined by the object's parameters. It provides:

  • Consistency: Ensures a standardized way to handle parameters across different classes.
  • Serialization: Simplifies saving and loading configuration-defined objects using JSON.
  • Reproducibility: Facilitates recreating objects with the same configuration, which is critical for debugging and sharing experiments.

By abstracting parameter handling, this library reduces boilerplate code and improves maintainability.

Usage

Most users will:

  • Inherit from ParameterizableClass in their own classes,
  • Implement the .get_params() method to expose the configuration needed to recreate the object, and (sometimes)
  • Implement the .essential_param_names property to expose the core parameters which determine the object's behavior.

Key Classes, Methods and Functions,

  • ParameterizableClass: Base class for parameterizable objects. Derive your class from it to enable the library’s features.
  • NotPicklableClass: Mixin that prevents pickling/unpickling; inherit from it to make your class explicitly non-picklable.
  • JsonSerializedObject: A string containing JSON-serialized object.
  • ParameterizableClass.get_params(): Implement in your subclass to return the configuration dictionary needed to recreate the object.
  • ParameterizableClass.get_default_params(): Class method returning default parameters for the class as a dictionary.
  • ParameterizableClass.essential_param_names: Implement in your subclass to return the names of the core parameters which determine the object's behavior. If not implemented, all parameters are considered essential.
  • ParameterizableClass.auxiliary_param_names: A property that returns the names of the auxiliary parameters.
  • ParameterizableClass.get_jsparams(): A method that serializes an object's parameters to a JSON string (JsonSerializedObject).
  • ParameterizableClass.get_essential_jsparams(): A method that returns a JSON string with essential parameters only.
  • ParameterizableClass.get_auxiliary_jsparams(): A method that returns a JSON string with auxiliary parameters only.
  • ParameterizableClass.get_default_jsparams(): Class method returning default parameters for the class as a JSON string.
  • dumpjs(obj): Return a JSON string representation of an object.
  • loadjs(js): Return an object from a JSON string.
  • update_jsparams(js, updates): Return a new JSON string with selected parameters updated without full deserialization.
  • access_jsparams(js, names): Return a dict with a subset of params, stored inside a JSON string.
  • sort_dict_by_keys(d): Utility to produce a new dict whose keys are sorted alphabetically.

How To Get It?

The source code is hosted on GitHub at: https://github.com/pythagoras-dev/parameterizable

Binary installers for the latest released version are available at the Python package index at: https://pypi.org/project/parameterizable

Using uv :

uv add parameterizable

Using pip (legacy alternative to uv):

pip install parameterizable

Requirements

  • Python >= 3.10
  • Runtime dependencies: none

For development:

  • pytest (optional)

Quick Start

Here's a minimal example showing how to make your class parameterizable and serialize/deserialize it:

from parameterizable.parameterizable import ParameterizableClass
from parameterizable.json_processor import dumpjs, loadjs

class MyModel(ParameterizableClass):
    def __init__(self, n_trees=10, depth=3, verbose=False):
        self.n_trees = n_trees
        self.depth = depth
        self.verbose = verbose

    def get_params(self) -> dict:
        # Only values returned here are considered this object's "parameters"
        return {"n_trees": self.n_trees, "depth": self.depth, "verbose": self.verbose}

    # Optional: list the parameters that define identity/behavior
    @property
    def essential_param_names(self) -> set[str]:
        return {"n_trees", "depth"}

m = MyModel(n_trees=50, depth=5, verbose=True)

# Serialize parameters to JSON
js = dumpjs(m)

# Recreate an equivalent object from JSON
m2 = loadjs(js)
assert isinstance(m2, MyModel)
assert m2.get_params() == m.get_params()

API Examples

  • Update parameters in JSON without full deserialization:
from parameterizable.json_processor import update_jsparams, dumpjs, loadjs

js2 = update_jsparams(js, n_trees=100)  # returns a new JSON string
m3 = loadjs(js2)
assert m3.n_trees == 100
  • Access a subset of parameters directly from JSON:
from parameterizable.json_processor import access_jsparams

subset = access_jsparams(js2, "n_trees", "depth")
assert subset == {"n_trees": 100, "depth": 5}
  • Work with essential/auxiliary parameters:
m.get_essential_params()      # {"n_trees": 50, "depth": 5}
m.get_essential_jsparams()    # JSON string with only essential params
m.get_auxiliary_params()      # {"verbose": True}
m.get_auxiliary_jsparams()    # JSON string with only auxiliary params
  • Sort dictionaries by keys (utility):
from parameterizable.dict_sorter import sort_dict_by_keys
sort_dict_by_keys({"b": 2, "a": 1})  # {"a": 1, "b": 2}
  • Prevent pickling/unpickling using NotPicklableClass:
import pickle
from parameterizable import NotPicklableClass

class Connection(NotPicklableClass):
    pass

conn = Connection()

# Any attempt to pickle or unpickle will raise TypeError
try:
    pickle.dumps(conn)
except TypeError:
    print("Connection cannot be pickled")

Development

  • Run tests:
    • With pytest: pytest
    • Or via Python: python -m pytest
  • Supported Python versions: 3.10+
  • See contributing guidelines: contributing.md

License

This project is licensed under the MIT License — see LICENSE for details.

Key Contacts

Metadata

Release files for parameterizable 0.105.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for parameterizable 0.105.2
File Size Uploaded Provenance Actions
parameterizable-0.105.2.tar.gz 56.7 kB Without provenance Details for parameterizable-0.105.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for parameterizable 0.105.2
File Interpreter ABI Platform Actions
parameterizable-0.105.2-py3-none-any.whl Python 3 none any Details for parameterizable-0.105.2-py3-none-any.whl

Total release size: 70.5 kB

Release files / parameterizable-0.105.2.tar.gz

Download URL parameterizable-0.105.2.tar.gz
Size 56.7 kB
Tags Source
SHA-256 checksum
How to use checksums
730522f9520aefd4addb121ddccb323f3749daa673232db082b4cfe9d32ffbcc
BLAKE2b-256 checksum
How to use checksums
4ecfdd7c262ddd415a21519b149af77d597f1afcbf6ab2201bdb80a92f8a61b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / parameterizable-0.105.2-py3-none-any.whl

Download URL parameterizable-0.105.2-py3-none-any.whl
Size 13.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0b756ebe0bff085bafc9f53f09606ecc8794d0d845bf7ccd93f285a1d4673f41
BLAKE2b-256 checksum
How to use checksums
ad4c0bfbe9eabcac61a874a739491e3e8df0ccb511900c0230388ad52303fba1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for parameterizable 0.105.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.105.2 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page