Ошибки python argparse с "%" в строке справки

У меня есть значение по умолчанию, которое содержит "%", которое я также вставляю в справочный документ моего аргумента. Например:.

default = "5% foo"
animrender_group.add_argument(
    "--foo",
    default=default,
    help="Foo amount. Default: %s" % default,
)
args = parser.parse_args()

Ошибки Argparse на parse_args()

[snip]
    args = parser.parse_args()
[snip]"../python2.5/site-packages/argparse.py", line 622, in _expand_help
    return self._get_help_string(action) % params
ValueError: unsupported format character 'O' (0x4f) at index 83

Ответ 1

Я попробовал традиционный escape-символ, который не сработал. Затем я нашел комментарий об использовании "%" в качестве escape-символа, и это сработало. Например:.

default = "5% foo"
foo_group.add_argument(
    "--foo",
    default=default,
    help="Foo amount. Default: %s" % default.replace(r"%", r"%%")),
)
args = parser.parse_args()

Я рад, что мне не нужно заменять все "%" на "знак процента". Хах.

Ответ 2

Другим способом включения значений по умолчанию является %(default)s в строке справки.

p=argparse.ArgumentParser()
p.add_argument('--foo', default="5% foo", help="Foo amount. Default: %(default)s")
p.print_help()

который производит

usage: ipython [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   Foo amount. Default: 5% foo

Из документации argparse:

Строки справки могут включать различные спецификаторы формата, чтобы избежать повторения таких вещей, как имя программы или аргумент default. Доступные спецификаторы включают имя программы,% (prog) s и большинство аргументов ключевого слова для add_argument(), например. % (по умолчанию) s,% (тип) s и т.д.:

Ответ 3

Вы можете использовать %% чтобы получить знак процента:

foo_group.add_argument("--foo", help="Foo amount. Default: 5%%")