yaml-arg-configer
A Python library for combining YAML configuration files with command-line arguments. It provides a flexible configuration management system with support for multiple config files, context variables, module imports, and function calls.
Table of Contents
- Installation
- Overview
- Quick Start
- Configuration Structure
- Custom YAML Tags
- Command-Line Options
- Documentation
- Troubleshooting
- License
Installation
# Install from PyPI (when available)
pip install yaml-arg-configer
# Install from source (editable)
pip install -e .
Overview
The YamlArgParser class bridges YAML configuration files and command-line arguments. It:
- Loads default values from a YAML file
- Merges with user-provided configurations
- Selects which config files to load via the command line
- Supports dynamic value resolution via custom YAML tags
Scope (by design):
- Flat key=value configs: each YAML key is one parameter. No deep merge, no dot-keys — nested values are used as-is, not overridden per sub-key.
- CLI selects files, YAML sets values: config keys appear in
--helpwith their help text, but values always come from config files, never the command line. - Hydra-lite: PyYAML-only, deliberately not growing into Hydra-style nested configs / config groups.
Features
| Feature | Description |
|---|---|
| Default Configuration | Load base settings from YAML files with default and help fields |
| Command-Line Selection | Pick which config files to load (-c, -d, --dc, -ctx) |
| Multiple Configurations | Combine multiple YAML config files in priority order |
| Context Resolution | Reference context variables using !ctx tag |
| Module Imports | Import attributes from Python modules using !ipt tag |
| Function Calls | Execute Python functions using !call tag |
| Path Operations | Use !join and !chain2path for path manipulation |
| Config Saving | Export current configuration back to YAML |
Quick Start
Basic Example
from yaml_arg_configer import YamlArgParser
# Initialize parser with default YAML file
yaml_parser = YamlArgParser(default_yaml='defaults.yaml')
# Parse command-line arguments
cmd_args = yaml_parser.parse_cmd_args()
# Parse configurations from YAML files
final_args = yaml_parser.parse_args(cmd_args)
# Access results
print(yaml_parser.get_args()) # argparse.Namespace
print(yaml_parser.args) # dict
print(yaml_parser['arg_name']) # dict-like access
print(yaml_parser.get('arg_name')) # dict-like access with default value, return None by default if arg not exist
yaml_parser.save_config('output.yaml') # Save to YAML
Programmatic Usage
from yaml_arg_configer import YamlArgParser
# Initialize parser
yaml_parser = YamlArgParser(default_yaml='defaults.yaml')
# Parse defaults
yaml_parser.parse_default('defaults.yaml')
# Update from additional YAML files
yaml_parser.update_from_yaml('config1.yaml', strict=True)
yaml_parser.update_from_yaml('config2.yaml', strict=True)
# Get final arguments as dict
final_args = yaml_parser.args
# Or as argparse.Namespace
final_args = yaml_parser.get_args()
Saving Configuration
# Save current configuration to YAML
yaml_parser.save_config('output_config.yaml')
Parsing Configurations from Directory
The parse_cfgs() method is convenient for loading configurations from a directory:
# Initialize parser
yaml_parser = YamlArgParser(default_yaml='defaults.yaml')
# Parse configurations from files in a directory
# Loads: config1.yaml, config2.yaml, etc.
final_args = yaml_parser.parse_cfgs(
cfgs=['config1', 'config2'], # Config file names (without .yaml)
cfg_dir='configs', # Directory containing config files
strict=True # Enforce validation
)
# Access results
print(final_args) # Returns dict with parsed arguments
Key Features:
- Automatically constructs file paths:
{cfg_dir}/{name}.yaml - Loads context from
ctx.yamlif specified - Parses defaults before applying config files
- Returns merged configuration as dictionary
Configuration Structure
Default Configuration (defaults.yaml)
arg1:
default: ~ # ~ means None
help: "Description for arg1"
arg2:
default: 42
help: "Number of iterations"
arg3: True # Simple format: value directly
arg4: "string value" # Simple format: string value
User Configuration (config1.yaml)
arg1: value1 # Override default value
arg2: 100 # Override another value
Context Management
Context YAML files support dynamic context management:
# ctx.yaml
import: !ipt
math: [sin, cos]
The !ipt tag can import multiple modules and attributes, which are then available for !ctx references.
Custom YAML Tags
The library extends PyYAML with custom tags for dynamic value resolution:
!ctx (context variables), !ipt (import module attributes), !call (function calls),
!join (flatten lists), !chain2path (join paths).
Full reference with examples: docs/yaml-tags.md
Command-Line Options
| Flag | Description | Example |
|---|---|---|
-d, --cfg_dir |
Directory containing YAML config files | -d configs |
-c, --cfg |
Names of configuration files to load | -c config1 config2 |
--dc |
Path to default YAML file (dest default_yaml) |
--dc defaults.yaml |
-ctx |
Path to context YAML file (dest ctx_yaml) |
-ctx ctx.yaml |
--strict |
Enforce user config keys exist in defaults | --strict |
--help |
Help for the built-in flags and all config keys (help text from the default YAML's help: fields) |
--help |
Config keys are registered as help-only --<key> options: they show up in
--help, but passing a value on the command line errors out — values come
from config files. Pass register_help_keys=False to the constructor to
disable this registration.
Example Commands
# Load defaults and config files
python examples/my_script.py --dc defaults.yaml -d configs -c config1 config2
# With context resolution
python examples/my_script.py --dc defaults.yaml -ctx ctx.yaml -d configs -c config1
# Show help (built-in flags + all config keys)
python examples/my_script.py --dc defaults.yaml --help
# Strict mode (enforce config validation)
python examples/my_script.py --dc defaults.yaml --strict -d configs -c config1
Documentation
- API Reference — full Python API for
YamlArgParserand the YAML loader - YAML Tags — custom tag reference with examples
Troubleshooting
Best Practices
- Start with defaults: Define comprehensive defaults in
defaults.yaml - Use context files: Centralize reusable values in
ctx.yaml - Document with help: Always provide
helptext for arguments - Validate with strict: Use
--strictto catch configuration errors - Chain configs: Load multiple configs for modular configuration
Common Issues
Missing keys in strict mode
- Symptom:
AssertionError: Argument 'X' not defined in the default configuration. - Solution: Ensure all user config keys appear in
defaults.yamlwith proper structure (even if using minimal entries)
Context variables not resolving
- Symptom:
KeyError: xxxwhen loading the config - Check that
ctx.yamlexists and is loaded via-ctxflag - Verify import paths are correct in context yaml (
import: !ipt) - Variable names match between import and reference
Config merging order wrong
- Symptom: Config file values overwritten by defaults instead of overriding them
- Explanation: Priority order is: later-loaded configs > earlier-loaded configs > defaults. The command line only selects which files load; it does not set values.
License
MIT
Metadata
Release files for yaml-arg-configer 0.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| yaml_arg_configer-0.1.8.tar.gz | 20.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yaml_arg_configer-0.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 34.7 kB
Release files / yaml_arg_configer-0.1.8.tar.gz
| Download URL | yaml_arg_configer-0.1.8.tar.gz |
|---|---|
| Size | 20.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dff09041ed975179e1d8b785795a9753563b6108b0003732a2aec8bea72baf29
|
|
BLAKE2b-256 checksum How to use checksums |
6bb2fb0256a262b548939d7fba26e3e4cbbaa9f8eb9e73dd8c751a4065a535b0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / yaml_arg_configer-0.1.8-py3-none-any.whl
| Download URL | yaml_arg_configer-0.1.8-py3-none-any.whl |
|---|---|
| Size | 13.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1fb1e320e365183277c580f0db8747db4d511abc049449bbac04362a8a68026d
|
|
BLAKE2b-256 checksum How to use checksums |
cf5f258d01e399adf9c5d1cc5e3aadb886b3730c5571eed0c1cb170377854a63
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|