argparse的add_argument中,const可以访问默认值吗?

问题描述 投票:0回答:2

假设您有一个 Python 程序,它只有一个选项并且没有位置参数。该选项本身带有一个可选参数(一个迭代器)。如果未指定选项,则应使用默认值。如果指定选项时不带参数,则应使用 same 默认值。否则应使用选项参数指定的值。

实现方式是这样的:

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument('-n', '--number', type=int, default=42, nargs='?', const=42, help='Number (default: %(default)d)')
arg = parser.parse_args()
print(arg.number)

假设将来某个时候您想要更改默认值。在上面的程序中,您必须在 two 位置替换它 - 在

default=
参数和
const=
参数中。当然,您可以在程序开头将其定义为常量,并在两个地方按名称使用相同的常量 - 但我的问题是,
const
参数是否可以访问为
default
参数指定的值 -非常像
help
论证可以吗?

python argparse
2个回答
0
投票

不,你不能。

%(default)d
- 是一个 说明符

Argparse 在解析您的

help
参数时使用此说明符并替换所需的值而不是说明符。

请参阅 argparse

documentation
中有关 help 说明符的更多信息。 文档中没有任何信息表明您可以在
default
const
参数中使用此类说明符。

我认为最好的做法是使用常量:

from argparse import ArgumentParser

DEFAULT_NUMBER: int = 42

parser = ArgumentParser()
parser.add_argument('-n', '--number', type=int, default=DEFAULT_NUMBER, nargs='?', const=DEFAULT_NUMBER, help='Number (default: %(default)d)')
arg = parser.parse_args()
print(arg.number)

0
投票
In [3]: parser = argparse.ArgumentParser()
   ...: a=parser.add_argument('-n', '--number', type=int, default=42, nargs='?', const=42, help='Number (default: %(default)d)')

In [4]: parser
Out[4]: ArgumentParser(prog='ipykernel_launcher.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)

add_argument
返回一个
Action
对象(除了将其存储在
parser._actions
列表中):

In [5]: a
Out[5]: _StoreAction(option_strings=['-n', '--number'], dest='number', nargs='?', const=42, default=42, type=<class 'int'>, choices=None, required=False, help='Number (default: %(default)d)', metavar=None)

此对象具有大多数

add_argument
参数的属性,这些参数可以修改(与大多数用户定义的类一样):

In [6]: a.default, a.const
Out[6]: (42, 42)

In [7]: a.const = a.default = 43

In [8]: parser.print_help()
usage: ipykernel_launcher.py [-h] [-n [NUMBER]]

options:
  -h, --help            show this help message and exit
  -n [NUMBER], --number [NUMBER]
                        Number (default: 43)

所以

const
可以在创建后修改,与
default
相同,或者不同。事实上,我质疑使用“?”的价值。两个参数相同。通常 '?'用于提供 3 路设置。

const
也可以显示在帮助中 - 我认为这就是其他答案试图解决的问题:

In [9]: a.help
Out[9]: 'Number (default: %(default)d)'

In [10]: a.help='Number (default %(default)d, const %(const)d))'

In [11]: parser.print_help()
usage: ipykernel_launcher.py [-h] [-n [NUMBER]]

options:
  -h, --help            show this help message and exit
  -n [NUMBER], --number [NUMBER]
                        Number (default 43, const 43))
© www.soinside.com 2019 - 2024. All rights reserved.