Skip to content

argparse: parse_args with a subparser + namespace tries to setdefault on a mappingproxy object #116850

Closed

Description

@alex-tianhuang

Bug report

Bug description:

I was using the namespace argument in parse_args and found that argparse tries to setdefault on a mapping proxy when parsing unknown extra attributes:

import argparse


parser = argparse.ArgumentParser()
subparser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
subparsers.add_parser(name="sub", add_help=False)


class MyNamespace:
    pass


try:
    parser.parse_args(["sub", "oops"], namespace=MyNamespace)
except SystemExit:
    pass
Traceback (most recent call last):
File "<path_to_script>", line 16, in <module>
parser.parse_args(["sub", "oops"], namespace=MyNamespace)
File "<python_installation>/lib/python3.12/argparse.py", line 1891, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "<python_installation>/lib/python3.12/argparse.py", line 1924, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "<python_installation>/lib/python3.12/argparse.py", line 2139, in _parse_known_args
stop_index = consume_positionals(start_index)
File "<python_installation>/lib/python3.12/argparse.py", line 2095, in consume_positionals
take_action(action, args)
File "<python_installation>/lib/python3.12/argparse.py", line 2000, in take_action
action(self, namespace, argument_values, option_string)
File "<python_installation>/lib/python3.12/argparse.py", line 1268, in call
vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
AttributeError: 'mappingproxy' object has no attribute 'setdefault'

I suspect this is because we're attempting to do vars(MyNamespace) instead of vars(argparse.Namespace) but I don't know much more than that.

I skimmed the top couple entries on the issue tracker with keywords 'argparse mappingproxy / argparse namespace' and found nothing, so I've decided that maybe nobody has reported this yet.

Using python 3.12.1 / argparse 1.1 / osx-arm64.

CPython versions tested on:

3.12

Operating systems tested on:

macOS

Linked PRs

Activity

  1. mimros commented on May 14, 2024

    @mimros

    Hi, I had same issue. I think you have to create instance of your namespace class.

    class MyNamespace:
        pass
    
    
    try:
        my_namespace = MyNamespace() <---------------------------------------------
        parser.parse_args(["sub", "oops"], namespace=my_namespace)
    except SystemExit:
        pass

    https://docs.python.org/3/library/argparse.html#argparse.Namespace

  2. added a commit that references this issue on Sep 27, 2024
  3. added a commit that references this issue on Sep 29, 2024
  4. added 2 commits that reference this issue on Sep 29, 2024
  5. added
    3.12only security fixes
    3.13only security fixes
    3.14bugs and security fixes
    on Sep 29, 2024
  6. added a commit that references this issue on Sep 29, 2024
  7. added a commit that references this issue on Oct 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

3.12only security fixes3.13only security fixes3.14bugs and security fixestype-bugAn unexpected behavior, bug, or error

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions