This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: [argparse] Using parse_known_args, unknown arg with space in value is interpreted as first positional arg
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 2.7
Status: closed Resolution: duplicate
Dependencies: Superseder: Argparse considers unknown optional arguments with spaces as a known positional argument
View: 22433
Assigned To: Nosy List: TabAtkins, paul.j3
Priority: normal Keywords:

Created on 2014-11-20 21:28 by TabAtkins, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg231448 - (view) Author: Tab Atkins Jr. (TabAtkins) Date: 2014-11-20 21:28
If using parse_known_args() to get argument pass-through, and one of the "unknown" arguments has a value with a space in it (even if quoted!), the entire unknown argument (key=value) will be interpreted as the value of the first positional argument instead.


import argparse
parser = argparse.ArgumentParser()
parser.add_argument("pos", nargs="?", default=None)

# (Namespace(pos=None), ['--foo=bar'])
# As expected.

parse.parse_known_args(["--foo='bar baz'"])
# (Namespace(pos="--foo='bar baz'"), [])
# What?!?

Since *known* arguments with spaces in them are parsed fine, this looks to be regression in a lesser-used feature.
msg231877 - (view) Author: paul j3 (paul.j3) * (Python triager) Date: 2014-11-30 01:45
This an issue for parse_args as well.  parse_args just calls parse_known_args, and raises an error if extras is not empty.

Early on in parsing, it tries to classify argument strings as either optionals (--flags) or positionals (arguments).  And there's an explicit test for spaces:

    def _parse_optional(self, arg_string):
        # if it contains a space, it was meant to be a positional
        if ' ' in arg_string:
            return None

Basically, if it can't match the string with a define optional, and it contains a space (anywhere) it is classed as positional.  That's what your example shows.

It sounds familiar, so I suspect it was raised in an earlier issue.  I'll have to look it up.
msg231879 - (view) Author: paul j3 (paul.j3) * (Python triager) Date: 2014-11-30 02:44
Duplicate of
Date User Action Args
2022-04-11 14:58:10adminsetgithub: 67098
2014-11-30 02:48:24berker.peksagsetstatus: open -> closed
superseder: Argparse considers unknown optional arguments with spaces as a known positional argument
stage: resolved
2014-11-30 02:44:38paul.j3setresolution: duplicate
messages: + msg231879
2014-11-30 01:45:35paul.j3setnosy: + paul.j3
messages: + msg231877
2014-11-20 21:28:58TabAtkinscreate