Fully typed configuration management, powered by Pydantic
Project description
nshconfig
Fully typed configuration management, powered by Pydantic
Motivation
As a machine learning researcher, I often found myself running numerous training jobs with various hyperparameters for the models I was working on. Keeping track of these parameters in a fully typed manner became increasingly important. While the excellent pydantic
library provided most of the functionality I needed, I wanted to add a few extra features to streamline my workflow. This led to the creation of nshconfig
.
Installation
You can install nshconfig
via pip:
pip install nshconfig
Usage
While the primary use case for nshconfig
is in machine learning projects, it can be used in any Python project where you need to store configurations in a fully typed manner.
Here's a basic example of how to use nshconfig
:
import nshconfig as C
class MyConfig(C.Config):
field1: int
field2: str
field3: C.AllowMissing[float] = C.MISSING
config = MyConfig.draft()
config.field1 = 42
config.field2 = "hello"
final_config = config.finalize()
print(final_config)
For more advanced usage and examples, please refer to the documentation.
Features
Draft Configs
Draft configs allow for a nicer API when creating configurations. Instead of relying on JSON or YAML files, you can create your configs using pure Python:
config = MyConfig.draft()
# Set some values
config.a = 10
config.b = "hello"
# Finalize the config
config = config.finalize()
This approach enables a more intuitive and expressive way of defining your configurations.
Motivation
The primary motivation behind draft configs is to provide a cleaner and more Pythonic way of creating configurations. By leveraging the power of Python, you can define your configs in a more readable and maintainable manner.
Usage Guide
-
Create a draft config using the
draft()
class method:config = MyConfig.draft()
-
Set the desired values on the draft config:
config.field1 = value1 config.field2 = value2
-
Finalize the draft config to obtain the validated configuration:
final_config = config.finalize()
MISSING Constant
The MISSING
constant is similar to None
, but with a key difference. While None
has the type NoneType
and can only be assigned to fields of type T | None
, the MISSING
constant has the type Any
and can be assigned to fields of any type.
Motivation
The MISSING
constant addresses a common issue when working with optional fields in configurations. Consider the following example:
import nshconfig as C
# Without MISSING:
class MyConfigWithoutMissing(C.Config):
age: int
age_str: str | None = None
def __post_init__(self):
if self.age_str is None:
self.age_str = str(self.age)
config = MyConfigWithoutMissing(age=10)
age_str_lower = config.age_str.lower()
# ^ The above line is valid code, but the type-checker will complain because `age_str` could be `None`.
In the above code, the type-checker will raise a complaint because age_str
could be None
. This is where the MISSING
constant comes in handy:
# With MISSING:
class MyConfigWithMissing(C.Config):
age: int
age_str: C.AllowMissing[str] = C.MISSING
def __post_init__(self):
if self.age_str is C.MISSING:
self.age_str = str(self.age)
config = MyConfigWithMissing(age=10)
age_str_lower = config.age_str.lower()
# ^ No more type-checker complaints!
By using the MISSING
constant, you can indicate that a field is not set during construction, and the type-checker will not raise any complaints.
Seamless Integration with PyTorch Lightning
nshconfig
seamlessly integrates with PyTorch Lightning by implementing the Mapping
interface. This allows you to use your configs directly as the hparams
argument in your Lightning modules without any additional effort.
Credit
nshconfig
is built on top of the incredible pydantic
library. Massive credit goes to the pydantic
team for creating such a powerful and flexible tool for data validation and settings management.
Contributing
Contributions are welcome! If you find any issues or have suggestions for improvement, please open an issue or submit a pull request on the GitHub repository.
License
nshconfig
is open-source software licensed under the MIT License.
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 nshconfig-0.23.0b0.tar.gz
.
File metadata
- Download URL: nshconfig-0.23.0b0.tar.gz
- Upload date:
- Size: 18.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.10.12 Linux/6.8.0-45-generic
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | af7cb55a77a02e0882d6ab6e1d46a83c57748d7547633b99da3043ef88abc109 |
|
MD5 | 19f44b899b2320c010307940c7a00786 |
|
BLAKE2b-256 | 0d3bcbc1e7a2c2d3a7fde37829c874a9a76943c94e034600a81bbc9fae734bd0 |
File details
Details for the file nshconfig-0.23.0b0-py3-none-any.whl
.
File metadata
- Download URL: nshconfig-0.23.0b0-py3-none-any.whl
- Upload date:
- Size: 19.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.10.12 Linux/6.8.0-45-generic
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c6cb9397df5f00532ee41e62a338fe0f9f8f1b9ab3cdee57f59095b5a33923b5 |
|
MD5 | 423d396ccd577d936b8f1f1f3de10a11 |
|
BLAKE2b-256 | 1ce074213a3f7be07cb23f8765922d228f52611f598a73f22a1e128e5b770feb |