Skip to main content

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

# 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:

  1. Loads default values from a YAML file
  2. Merges with user-provided configurations
  3. Selects which config files to load via the command line
  4. 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 --help with 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.yaml if 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 YamlArgParser and the YAML loader
  • YAML Tags — custom tag reference with examples

Troubleshooting

Best Practices

  1. Start with defaults: Define comprehensive defaults in defaults.yaml
  2. Use context files: Centralize reusable values in ctx.yaml
  3. Document with help: Always provide help text for arguments
  4. Validate with strict: Use --strict to catch configuration errors
  5. 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.yaml with proper structure (even if using minimal entries)

Context variables not resolving

  • Symptom: KeyError: xxx when loading the config
  • Check that ctx.yaml exists and is loaded via -ctx flag
  • 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.7

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

Source distribution (sdist)

Source distribution for yaml-arg-configer 0.1.7
File Size Uploaded
yaml_arg_configer-0.1.7.tar.gz 18.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for yaml-arg-configer 0.1.7
File Interpreter ABI Platform
yaml_arg_configer-0.1.7-py3-none-any.whl Python 3 none any Details

Total release size: 30.4 kB

Release files / yaml_arg_configer-0.1.7.tar.gz

Download URL yaml_arg_configer-0.1.7.tar.gz
Size 18.3 kB
Tags Source
SHA-256 checksum
How to use checksums
72d0bf24943300c2d1a1242ac927577c15ea4e60f9aca7078dac27c09b76371e
BLAKE2b-256 checksum
How to use checksums
34cf2ec646c9fa75adfe43b40b033462a516c23eff893947596cfdd77f9dc3a0
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.7-py3-none-any.whl

Download URL yaml_arg_configer-0.1.7-py3-none-any.whl
Size 12.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1dd10e6bd272441c0580c9a24996a509e3022728471dd76721a7f9f5de6a2af7
BLAKE2b-256 checksum
How to use checksums
c67ff3e0321b498b5dfba8b81777811a85e88291af9e4a6279945d4467adb6d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.9

Release history Release notifications | RSS feed

0.1.8

2 release files

This release

0.1.7 This release

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

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