Configuration Formats
nshconfig supports multiple formats for creating and serializing configurations, making it flexible for different use cases.
Python File/Module Support
nshconfig supports loading configurations directly from Python files and modules:
from mypackage import ModelConfig
# Load from Python file
config1 = ModelConfig.from_python_file("model_config.py")
# Load from Python module
config2 = ModelConfig.from_python_module("myapp.configs.model")
The Python file or module should export either:
A
__config__
variable containing an instance of the configuration classA
__create_config__
function that returns an instance of the configuration class
Example configuration file:
# model_config.py
from mypackage import ModelConfig
# Option 1: Using __config__ variable
__config__ = ModelConfig(
hidden_size=256,
num_layers=4
)
# Option 2: Using __create_config__ function
def __create_config__():
return ModelConfig(
hidden_size=256,
num_layers=4
)
JSON Support
You can create and save configurations using JSON:
import nshconfig as C
class ModelConfig(C.Config):
hidden_size: int
num_layers: int
# Create from JSON string
config1 = ModelConfig.from_json_str('{"hidden_size": 256, "num_layers": 4}')
# Load from JSON file
config2 = ModelConfig.from_json_file("model_config.json")
# Save to JSON string
json_str = config1.to_json_str()
# Save to JSON file
config1.to_json_file("model_config.json")
YAML Support
YAML support requires installing the pydantic-yaml
package:
pip install "nshconfig[extra]" # Installs all extras
pip install "nshconfig[yaml]" # Installs only the YAML extra
pip install pydantic-yaml # Or install directly
Then you can work with YAML formats:
class ModelConfig(C.Config):
hidden_size: int
num_layers: int
# Create from YAML string
config1 = ModelConfig.from_yaml_str("""
hidden_size: 256
num_layers: 4
""")
# Load from YAML file
config2 = ModelConfig.from_yaml("model_config.yaml")
# Save to YAML string
yaml_str = config1.to_yaml_str()
# Save to YAML file
config1.to_yaml_file("model_config.yaml")
Type-Safe Adapters
For more fine-grained control over configuration conversion and validation, nshconfig provides a type-safe Adapter class that wraps Pydantic’s TypeAdapter functionality. While Config classes provide their own serialization methods, the Adapter class allows you to validate and serialize any type - including complex nested types and non-Config types:
from nshconfig import Config
from nshconfig.adapter import Adapter
class ModelConfig(Config):
hidden_size: int
num_layers: int
# Create adapters for different types
model_adapter = Adapter(ModelConfig)
tuple_adapter = Adapter(tuple[ModelConfig, int, str])
dict_adapter = Adapter(dict[str, ModelConfig])
# Validate and convert different data structures
config = model_adapter.from_dict({
"hidden_size": 256,
"num_layers": 4
})
# Validate tuple of (ModelConfig, int, str)
validated = tuple_adapter.from_dict([
{"hidden_size": 256, "num_layers": 4},
42,
"hello"
])
# Validate dictionary of ModelConfigs
configs = dict_adapter.from_dict({
"model1": {"hidden_size": 256, "num_layers": 4},
"model2": {"hidden_size": 512, "num_layers": 8}
})
The adapter provides type-safe conversion between different formats while maintaining all validation rules. This is particularly useful when you need to:
Load configuration files in different formats
Save configuration state to disk
Convert between different representations of your data while ensuring type safety
Validate external data against complex types
Work with collections of configurations
Each conversion method accepts additional parameters to customize the serialization/deserialization process, such as excluding certain fields, handling defaults, or controlling validation strictness. See Pydantic’s TypeAdapter documentation for more details on the underlying functionality.
Schema References
When saving to JSON or YAML, you can include schema references that enable better IDE support:
# Include schema reference in JSON
config.to_json_file("config.json", with_schema=True)
# Include schema reference in YAML
config.to_yaml_file("config.yaml", with_schema=True)
The schema references help IDEs provide autocompletion and validation when editing the configuration files.