Examples

This section provides detailed examples of different ways to use ConditionalArgumentParser.

Basic Usage

This example shows the simplest use case for conditional arguments - adding an argument that only appears when a flag is set.

from conditional_parser import ConditionalArgumentParser

# Create parser
parser = ConditionalArgumentParser(description="A parser with conditional arguments.")

# Add base argument
parser.add_argument("--use-regularization",
                   default=False,
                   action="store_true",
                   help="Uses regularization if included.")

# Add conditional argument
parser.add_conditional(
    "use_regularization",         # check this argument
    True,                         # when it's True
    "--regularizer-lambda",       # add this argument
    type=float,
    default=0.01,
    help="The lambda value for the regularizer."
)

Usage Examples:

Without regularization:

$ python script.py
Namespace(use_regularization=False)

With regularization:

$ python script.py --use-regularization --regularizer-lambda 0.1
Namespace(use_regularization=True, regularizer_lambda=0.1)

Error case (trying to set conditional without meeting condition):

$ python script.py --regularizer-lambda 0.1
error: unrecognized arguments: --regularizer-lambda 0.1
Parallel Conditionals

This example demonstrates using multiple conditional arguments in parallel, triggered by different values of the same parent argument.

from conditional_parser import ConditionalArgumentParser

parser = ConditionalArgumentParser()

# Base argument that controls multiple sets of conditionals
parser.add_argument("dataset", type=str,
                   help="Which dataset to use for training/testing.")

# Dataset1-specific parameters
parser.add_conditional("dataset", "dataset1",
                     "--dataset1-prm1", type=int,
                     help="Parameter 1 for dataset1")
parser.add_conditional("dataset", "dataset1",
                     "--dataset1-prm2", type=int,
                     help="Parameter 2 for dataset1")

# Dataset2-specific parameters
parser.add_conditional("dataset", "dataset2",
                     "--dataset2-prmA", type=str,
                     help="Parameter A for dataset2")
parser.add_conditional("dataset", "dataset2",
                     "--dataset2-prmB", type=str,
                     help="Parameter B for dataset2")

# Parameters shared between dataset3 and dataset4
parser.add_conditional("dataset",
                     lambda d: d in ["dataset3", "dataset4"],
                     "--datasets34-prmX", type=str,
                     help="Parameter X for datasets 3 and 4")

Key Features Demonstrated

  • Multiple conditionals can depend on the same parent argument

  • Different values of the parent can trigger different conditionals

  • Lambda functions allow complex conditional logic

  • Conditionals can be shared across multiple values

Hierarchical Conditionals

This example shows how to create nested conditional arguments, where one conditional argument can trigger additional conditional arguments.

from conditional_parser import ConditionalArgumentParser

parser = ConditionalArgumentParser()

# Top-level argument
parser.add_argument("--use-curriculum",
                   default=False,
                   action="store_true",
                   help="Use curriculum for training.")

# First-level conditional (activated when '--use-curriculum' is set)
parser.add_conditional("use_curriculum", True,
                     "--curriculum", type=str, required=True,
                     help="Which curriculum to use")

# Second-level conditional for curriculum1 (activated when '--curriculum' is "curriculum1")
parser.add_conditional("curriculum", "curriculum1",
                     "--curriculum1-prm1", type=int, required=True,
                     help="Parameter 1 for curriculum1")
parser.add_conditional("curriculum", "curriculum1",
                     "--curriculum1-prm2", type=int, required=True,
                     help="Parameter 2 for curriculum1")

# Second-level conditional for curriculum2 (activated when '--curriculum' is "curriculum2")
parser.add_conditional("curriculum", "curriculum2",
                     "--curriculum1-prm2", type=int, default=128,
                     help="Parameter A for curriculum2")
parser.add_conditional("curriculum", "curriculum2",
                     "--curriculum1-prm2", type=int, default=128,
                     help="Parameter B for curriculum2")

Understanding the Hierarchy

  1. --use-curriculum is the top-level flag

  2. When True, it enables the --curriculum argument

  3. When --curriculum is “curriculum1”, it enables curriculum1-specific parameters

  4. When --curriculum is “curriculum2”, it enables curriculum2-specific parameters

This creates a tree of dependencies:

--use-curriculum
    └── --curriculum
        ├── curriculum1
        │   ├── --curriculum1-prm1
        │   └── --curriculum1-prm2
        └── curriculum2
            ├── --curriculum2-prmA
            └── --curriculum2-prmB