Skip to content

Commit e156dd4

Browse files
ptim0626ZeroIntensitychris-eiblsavannahostrowski
authored andcommitted
gh-153967: handle invalid file object in argparse._print_message (GH-153969)
(cherry picked from commit 115400b) Co-authored-by: Timothy Poon <62692924+ptim0626@users.noreply.github.com> 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 be93a4a commit e156dd4

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
@@ -2916,11 +2916,14 @@ def print_help(self, file=None):
29162916
self._print_message(help_text, file)
29172917

29182918
def _print_message(self, message, file=None):
2919-
if message:
2920-
file = file or _sys.stderr
2919+
if not message:
2920+
return
2921+
if file is None:
2922+
file = _sys.stderr
2923+
if file is not None:
29212924
try:
29222925
file.write(message)
2923-
except (AttributeError, OSError):
2926+
except OSError:
29242927
pass
29252928

29262929
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
@@ -79,6 +79,24 @@ def test_skip_invalid_stdout(self):
7979
func()
8080
self.assertRegex(mocked_stderr.getvalue(), r'usage:')
8181

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

83101
class TestLazyImports(unittest.TestCase):
84102
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)