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
- Applies command-line overrides
- Supports dynamic value resolution via custom YAML tags
Features
| Feature | Description |
|---|---|
| Default Configuration | Load base settings from YAML files with default and help fields |
| Command-Line Override | Override settings via CLI arguments (-c, -d, etc.) |
| 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
torch.nn:
relu: ReLU
gelu: GELU
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 |
--doc <arg> |
Get help for specific argument(s) | --doc arg1 arg2 |
--docs |
Print help for all arguments | --docs |
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
# Get help documentation
python examples/my_script.py --docs
python examples/my_script.py --doc arg1 arg2
# 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: CLI args > user configs > defaults. Ensure config files load after defaults
License
MIT
Metadata
Release files for yaml-arg-configer 0.1.6
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.6.tar.gz | 14.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yaml_arg_configer-0.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.1 kB
Release files / yaml_arg_configer-0.1.6.tar.gz
| Download URL | yaml_arg_configer-0.1.6.tar.gz |
|---|---|
| Size | 14.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6158610fd28fac496fb6e27a73e78cdf438d1e731142b2482a6bc1868f681b65
|
|
BLAKE2b-256 checksum How to use checksums |
e9013835a065cf341d88c23a9c0dda768b4e87a224409b5733a968238b5bb57f
|
| 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.6-py3-none-any.whl
| Download URL | yaml_arg_configer-0.1.6-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bba626b60159d50abafa1d250936182075442ad339b702b7d8dcae7f5f794c56
|
|
BLAKE2b-256 checksum How to use checksums |
0644ef2f80d5e776999654de114e6cf58003cbc5593b32678189fe8222d9c6db
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|