python / python/cpython

argparse: long options with mixed prefix characters

Open
#138,701 1 comment 0 reactions 1 assignee View on GitHub

@serhiy-storchaka is already working on this.

Since Sep 9, 2025.

stdlib triaged type-bug type-feature
Dominant language
Python
Stars
77.2k
Forks
35.9k
PR merge metrics
PR metrics pending

Description

argparse supports alternate prefix characters. I believe that this is to support on/off switches like -x/+x and Windows-style options like /h (for complete emulation of the Windows command syntax we need support of the : separator and combining options like in dir /s/w/o/p/a:-d, but this is another story). I never seen even double alternate prefix character, like ++foo or //foo in the wild, but there is no issue with supporting this.

The problem is that this allows specifying options that use two different prefix character, like -+foo or +-foo. It is a problem because you cannot distinguish a sigle-dash option from a double-dash option without knowing prefix._chars. And its value is not always available (for example in the Action constructor). BooleanOptionalAction can recognize ++foo and +foo, but it is confused by +^foo (see #138692).

There are no existing tests for mixed alternate prefix characters. I suppose this is not an intentionally added feature, but just an implementation artifact. I think that we should revisit code and only interpret option as a "double-dash long option" if it starts with the same prefix character doubled. This may have no effect on common users, since -+foo can still be interpreted as a "single-dash long option" (with name "+foo"). We should ensure that single-dash long options are not second-class citizens (for example see #138697).

I'm not sure how to classify this issue or what action to take. This requires further research and experimentation. I'm leaving this as a reminder that something needs to be done.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.