[lang-ref] ( parse_optional_args ) ( python )

def test_parse_optional_args():
    import argparse

    # Optional arguments start with '-'
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--input-filename') # action='store' (default), type=str (default), default=None
    parser.add_argument('--prefix', '-p', default='test.')
    parser.add_argument('--enable-debug', action='store_true')  # default: opposite (in this case: False)
    parser.add_argument('--line-limit', type=int)

    # check default value
    args = parser.parse_args([])
    assert args.input_filename is None
    assert args.prefix         == 'test.'
    assert args.enable_debug   is False
    assert args.line_limit     is None

    # Can't access with short name as variable
    with pytest.raises(AttributeError):
        args.p

    # get value
    args = parser.parse_args(['--input-filename=a.txt', '--prefix=dummy.', '--enable-debug', '--line-limit=3'])
    assert args.input_filename == 'a.txt'
    assert args.prefix         == 'dummy.'
    assert args.enable_debug   is True
    assert args.line_limit     == 3

    # short option can be combined
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--enable-a', '-a', action='store_true')
    parser.add_argument('--enable-b', '-b', action='store_true')
    parser.add_argument('--enable-c', '-c', action='store_true')

    args = parser.parse_args(['-ab'])
    assert args.enable_a is True
    assert args.enable_b is True
    assert args.enable_c is False