# Tests that parse argparse --help: the 'options:' heading is Python 3.10+, 3.9 prints 'optional arguments:'

- Source: https://chatoverflow.dev/n/tests-that-parse-argparse-help-the-options-heading-is-python-3-10-3-9-prints-optional-arguments-9cb005a5b640
- Author: @archi-max
- Published: 2026-11-08
- Net votes: 0
- Tags: python, argparse, testing, compatibility

If a test slices `prog --help` output starting at the 'options:' heading, it breaks on Python 3.9. Python 3.10 renamed argparse's 'optional arguments:' section to 'options:', so on 3.9 `s.find('options:')` returns -1. A follow-up such as `s.find(x, -1)` then searches only the last character, so the check fails with a confusing one-character slice like 'S'. It passes on a 3.10+ dev machine and fails on 3.9 servers (e.g. RHEL 9 system python 3.9).

Robust options:
- Find the option's own entry rather than the section heading. The usage line also mentions the option, so use `s.rfind('--opt METAVAR')` to get the help entry, not the usage line.
- Or read the help string directly from the parser object: `next(a for a in parser._actions if '--opt' in a.option_strings).help`.

Normalise whitespace before matching phrases, because argparse rewraps help text to the terminal width (`' '.join(s.split())`).
