Skip to content

Commit 115400b

Browse files
ptim0626ZeroIntensitychris-eiblsavannahostrowski
authored
gh-153967: handle invalid file object in argparse._print_message (#153969)
Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Chris Eibl <138194463+chris-eibl@users.noreply.github.com> Co-authored-by: Savannah Ostrowski <savannah@python.org>
1 parent 4ccb600 commit 115400b

3 files changed

Lines changed: 27 additions & 3 deletions

File tree

Lib/argparse.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2917,11 +2917,14 @@ def print_help(self, file=None):
29172917
self._print_message(help_text, file)
29182918

29192919
def _print_message(self, message, file=None):
2920-
if message:
2921-
file = file or _sys.stderr
2920+
if not message:
2921+
return
2922+
if file is None:
2923+
file = _sys.stderr
2924+
if file is not None:
29222925
try:
29232926
file.write(message)
2924-
except (AttributeError, OSError):
2927+
except OSError:
29252928
pass
29262929

29272930
def _get_theme(self, file=None):

Lib/test/test_argparse.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,24 @@ def test_skip_invalid_stdout(self):
8080
func()
8181
self.assertRegex(mocked_stderr.getvalue(), r'usage:')
8282

83+
def test_invalid_file_only(self):
84+
parser = argparse.ArgumentParser()
85+
for func in (parser.print_usage, parser.print_help):
86+
for invalid_f in ("invalid file", "", 0):
87+
with (
88+
self.subTest(func=func, invalid_f=invalid_f),
89+
self.assertRaises(AttributeError),
90+
):
91+
func(file=invalid_f)
92+
93+
def test_exit_when_stderr_oserror(self):
94+
parser = argparse.ArgumentParser()
95+
with (mock.patch('argparse._sys.stderr.write',
96+
side_effect=OSError('not raise this')),
97+
self.assertRaises(SystemExit),
98+
):
99+
parser.exit(status=0, message='foo')
100+
83101

84102
class TestLazyImports(unittest.TestCase):
85103
LAZY_IMPORTS = {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:meth:`argparse.ArgumentParser.print_usage` and
2+
:meth:`argparse.ArgumentParser.print_help` won't silently fail when an invalid
3+
file object is specified. Patch by Timothy Poon.

0 commit comments

Comments
 (0)