bpo-45235: Fix argparse overrides namespace with subparser defaults (… · python/cpython@a6e8db5 (original) (raw)

`@@ -1209,7 +1209,8 @@ def call(self, parser, namespace, values, option_string=None):

`

1209

1209

`# namespace for the relevant parts.

`

1210

1210

`subnamespace, arg_strings = parser.parse_known_args(arg_strings, None)

`

1211

1211

`for key, value in vars(subnamespace).items():

`

1212

``

`-

setattr(namespace, key, value)

`

``

1212

`+

if not hasattr(namespace, key):

`

``

1213

`+

setattr(namespace, key, value)

`

1213

1214

``

1214

1215

`if arg_strings:

`

1215

1216

`vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])

`

`@@ -1843,11 +1844,6 @@ def parse_known_args(self, args=None, namespace=None):

`

1843

1844

`if action.default is not SUPPRESS:

`

1844

1845

`setattr(namespace, action.dest, action.default)

`

1845

1846

``

1846

``

`-

add any parser defaults that aren't present

`

1847

``

`-

for dest in self._defaults:

`

1848

``

`-

if not hasattr(namespace, dest):

`

1849

``

`-

setattr(namespace, dest, self._defaults[dest])

`

1850

``

-

1851

1847

`# parse the arguments and exit if there are any errors

`

1852

1848

`if self.exit_on_error:

`

1853

1849

`try:

`

`@@ -1858,6 +1854,11 @@ def parse_known_args(self, args=None, namespace=None):

`

1858

1854

`else:

`

1859

1855

`namespace, args = self._parse_known_args(args, namespace)

`

1860

1856

``

``

1857

`+

add any parser defaults that aren't present

`

``

1858

`+

for dest in self._defaults:

`

``

1859

`+

if not hasattr(namespace, dest):

`

``

1860

`+

setattr(namespace, dest, self._defaults[dest])

`

``

1861

+

1861

1862

`if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):

`

1862

1863

`args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))

`

1863

1864

`delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)

`