假设您有一个 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
论证可以吗?
不,你不能。
%(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)
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))