File size: 2,739 Bytes
d06fa57 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | # Copyright (c) 2024-present, Yumeow. Licensed under the MIT License.
import argparse
def add_minus_flags(parser: argparse.ArgumentParser):
"""
自动为 argparse.ArgumentParser 中含有下划线的参数添加别名。例如:
--fix_existing -> 添加别名 --fix-existing
--augment_OD_num -> 添加别名 --augment-OD-num
"""
for action in parser._actions:
# 仅处理可选参数(以 '-' 开头的参数)
if not action.option_strings:
continue
aliases_to_add = []
for opt in action.option_strings:
if opt.startswith('--') and '_' in opt:
new_alias = opt.replace('_', '-')
if new_alias not in action.option_strings:
aliases_to_add.append(new_alias)
for alias in aliases_to_add:
action.option_strings.append(alias)
parser._option_string_actions[alias] = action
return parser
def add_negation_flags(parser: argparse.ArgumentParser):
"""
自动为 parser 中的 store_true 参数添加对应的 --no-xxx 选项。
"""
args_to_add = []
# 建立现有 flag 索引,防止重复添加
existing_flags = set()
for action in parser._actions:
existing_flags.update(action.option_strings)
for action in parser._actions:
if isinstance(action, argparse._StoreTrueAction):
# 为当前 action 收集所有可能的否定别名
negation_aliases = []
for option in action.option_strings:
if not option.startswith('--'):
continue
# 生成否定形式:--use_new_model -> --no-use_new_model
raw_name = option.removeprefix('--')
neg_opt = f'--no-{raw_name}'
# 只有当这个 flag 还不存在时才添加
if neg_opt not in existing_flags:
negation_aliases.append(neg_opt)
# 如果生成了有效的否定别名,将它们打包准备添加
if negation_aliases:
# 选取第一个选项名作为帮助文档显示的名称
primary_name = action.option_strings[0].removeprefix('--')
args_to_add.append({
'options': negation_aliases, # 这里是一个列表
'dest': action.dest,
'action': 'store_false',
'default': action.default,
'help': f"Disable {primary_name}"
})
for arg in args_to_add:
parser.add_argument(*arg['options'], dest=arg['dest'], action=arg['action'], default=arg['default'], help=(
arg['help']
))
return parser
|