Skip to content

GH-130645: Default to color help in argparse #136809

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 20, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Default to color help in argparse
  • Loading branch information
hugovk committed Jul 19, 2025
commit f93920d098c24d6977ef0e71ca7dbc0bdfc17f8e
4 changes: 2 additions & 2 deletions Lib/argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -1231,7 +1231,7 @@ def __init__(self,
self._name_parser_map = {}
self._choices_actions = []
self._deprecated = set()
self._color = False
self._color = True

super(_SubParsersAction, self).__init__(
option_strings=option_strings,
Expand Down Expand Up @@ -1878,7 +1878,7 @@ def __init__(self,
exit_on_error=True,
*,
suggest_on_error=False,
color=False,
color=True,
):
superinit = super(ArgumentParser, self).__init__
superinit(description=description,
Expand Down
21 changes: 20 additions & 1 deletion Lib/test/test_argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
import warnings

from enum import StrEnum
from test.support import captured_stderr
from test.support import (
captured_stderr,
force_not_colorized,
force_not_colorized_test_class,
)
from test.support import import_helper
from test.support import os_helper
from test.support import script_helper
Expand Down Expand Up @@ -1007,6 +1011,7 @@ def test_parse_enum_value(self):
args = parser.parse_args(['--color', 'red'])
self.assertEqual(args.color, self.Color.RED)

@force_not_colorized
def test_help_message_contains_enum_choices(self):
parser = argparse.ArgumentParser()
parser.add_argument('--color', choices=self.Color, help='Choose a color')
Expand Down Expand Up @@ -2403,6 +2408,7 @@ def test_modified_invalid_action(self):
# Subparsers tests
# ================

@force_not_colorized_test_class
class TestAddSubparsers(TestCase):
"""Test the add_subparsers method"""

Expand Down Expand Up @@ -3009,6 +3015,7 @@ def test_nested_argument_group(self):
# Parent parser tests
# ===================

@force_not_colorized_test_class
class TestParentParsers(TestCase):
"""Tests that parsers can be created with parent parsers"""

Expand Down Expand Up @@ -3216,6 +3223,7 @@ def test_mutex_groups_parents(self):
# Mutually exclusive group tests
# ==============================

@force_not_colorized_test_class
class TestMutuallyExclusiveGroupErrors(TestCase):

def test_invalid_add_argument_group(self):
Expand Down Expand Up @@ -3344,21 +3352,25 @@ def test_successes_when_required(self):
actual_ns = parse_args(args_string.split())
self.assertEqual(actual_ns, expected_ns)

@force_not_colorized
def test_usage_when_not_required(self):
format_usage = self.get_parser(required=False).format_usage
expected_usage = self.usage_when_not_required
self.assertEqual(format_usage(), textwrap.dedent(expected_usage))

@force_not_colorized
def test_usage_when_required(self):
format_usage = self.get_parser(required=True).format_usage
expected_usage = self.usage_when_required
self.assertEqual(format_usage(), textwrap.dedent(expected_usage))

@force_not_colorized
def test_help_when_not_required(self):
format_help = self.get_parser(required=False).format_help
help = self.usage_when_not_required + self.help
self.assertEqual(format_help(), textwrap.dedent(help))

@force_not_colorized
def test_help_when_required(self):
format_help = self.get_parser(required=True).format_help
help = self.usage_when_required + self.help
Expand Down Expand Up @@ -4030,11 +4042,13 @@ def _test(self, tester, parser_text):
tester.maxDiff = None
tester.assertEqual(expected_text, parser_text)

@force_not_colorized
def test_format(self, tester):
parser = self._get_parser(tester)
format = getattr(parser, 'format_%s' % self.func_suffix)
self._test(tester, format())

@force_not_colorized
def test_print(self, tester):
parser = self._get_parser(tester)
print_ = getattr(parser, 'print_%s' % self.func_suffix)
Expand All @@ -4047,6 +4061,7 @@ def test_print(self, tester):
setattr(sys, self.std_name, old_stream)
self._test(tester, parser_text)

@force_not_colorized
def test_print_file(self, tester):
parser = self._get_parser(tester)
print_ = getattr(parser, 'print_%s' % self.func_suffix)
Expand Down Expand Up @@ -4788,6 +4803,7 @@ class TestHelpUsageMetavarsSpacesParentheses(HelpTestCase):
version = ''


@force_not_colorized_test_class
class TestHelpUsageNoWhitespaceCrash(TestCase):

def test_all_suppressed_mutex_followed_by_long_arg(self):
Expand Down Expand Up @@ -5469,6 +5485,7 @@ def custom_type(string):
version = ''


@force_not_colorized_test_class
class TestHelpCustomHelpFormatter(TestCase):
maxDiff = None

Expand Down Expand Up @@ -5765,6 +5782,7 @@ def test_conflict_error(self):
self.assertRaises(argparse.ArgumentError,
parser.add_argument, '--spam')

@force_not_colorized
def test_resolve_error(self):
get_parser = argparse.ArgumentParser
parser = get_parser(prog='PROG', conflict_handler='resolve')
Expand Down Expand Up @@ -6829,6 +6847,7 @@ def setUp(self):
metavar = '<http[s]://example:1234>'
self.parser.add_argument('--proxy', metavar=metavar)

@force_not_colorized
def test_help_with_metavar(self):
help_text = self.parser.format_help()
self.assertEqual(help_text, textwrap.dedent('''\
Expand Down
Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy