使用子解析器时,命令行参数被默认值覆盖
Command-line argument overwritten by default value when using subparser
我有一个带有子命令的程序,但它们都有共同的参数(例如,它们都需要输入和输出目录),我将这些参数包含在父解析器中以避免冗余。但是,我希望每个子命令都有不同的默认值,但这会导致忽略命令行中提供的值。
MWE:
import argparse
top_parser = argparse.ArgumentParser()
top_parser.add_argument("--input-dir", type=str)
subparsers = top_parser.add_subparsers()
generate_parser = subparsers.add_parser("generate")
generate_parser.set_defaults(input_dir=".")
process_parser = subparsers.add_parser("process")
process_parser.set_defaults(input_dir="SOME_OTHER_DIR")
generate_args = top_parser.parse_args("--input-dir USE_THIS_DIR generate".split())
print("generate_args = ", generate_args)
process_args = top_parser.parse_args("--input-dir USE_THIS_DIR process".split())
print("process_args = ", process_args)
这给出:
generate_args = Namespace(input_dir='.')
process_args = Namespace(input_dir='SOME_OTHER_DIR')
但我想要:
generate_args = Namespace(input_dir='USE_THIS_DIR')
process_args = Namespace(input_dir='USE_THIS_DIR')
我可以通过分别向每个子解析器添加参数来避免这种情况,但我想尽可能避免这种冗余。
一种解决方法是在解析后检查 input_dir
的值,并在那时替换特定于子解析器的默认值。
import argparse
top_parser = argparse.ArgumentParser()
top_parser.add_argument("--input-dir", type=str)
subparsers = top_parser.add_subparsers()
generate_parser = subparsers.add_parser("generate")
generate_parser.set_defaults(alt_input_dir=".")
process_parser = subparsers.add_parser("process")
process_parser.set_defaults(alt_input_dir="SOME_OTHER_DIR")
args = top_parser.parse_args()
if args.input_dir is None:
args.input_dir = args.alt_input_dir
del args.alt_input_dir
我有一个带有子命令的程序,但它们都有共同的参数(例如,它们都需要输入和输出目录),我将这些参数包含在父解析器中以避免冗余。但是,我希望每个子命令都有不同的默认值,但这会导致忽略命令行中提供的值。
MWE:
import argparse
top_parser = argparse.ArgumentParser()
top_parser.add_argument("--input-dir", type=str)
subparsers = top_parser.add_subparsers()
generate_parser = subparsers.add_parser("generate")
generate_parser.set_defaults(input_dir=".")
process_parser = subparsers.add_parser("process")
process_parser.set_defaults(input_dir="SOME_OTHER_DIR")
generate_args = top_parser.parse_args("--input-dir USE_THIS_DIR generate".split())
print("generate_args = ", generate_args)
process_args = top_parser.parse_args("--input-dir USE_THIS_DIR process".split())
print("process_args = ", process_args)
这给出:
generate_args = Namespace(input_dir='.')
process_args = Namespace(input_dir='SOME_OTHER_DIR')
但我想要:
generate_args = Namespace(input_dir='USE_THIS_DIR')
process_args = Namespace(input_dir='USE_THIS_DIR')
我可以通过分别向每个子解析器添加参数来避免这种情况,但我想尽可能避免这种冗余。
一种解决方法是在解析后检查 input_dir
的值,并在那时替换特定于子解析器的默认值。
import argparse
top_parser = argparse.ArgumentParser()
top_parser.add_argument("--input-dir", type=str)
subparsers = top_parser.add_subparsers()
generate_parser = subparsers.add_parser("generate")
generate_parser.set_defaults(alt_input_dir=".")
process_parser = subparsers.add_parser("process")
process_parser.set_defaults(alt_input_dir="SOME_OTHER_DIR")
args = top_parser.parse_args()
if args.input_dir is None:
args.input_dir = args.alt_input_dir
del args.alt_input_dir