定义子解析器的通常方法是:
master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
parser = subparsers.add_parser('sub')
parser.add_argument('--subopt')
子解析器将被调用
command sub --subopt
我正在实现一个调用多个转换器的包。如果我使用通常的子解析器方法,我将不得不这样做
convert ext1_to_ext2 file.ext1 file.ext2 --args
这既重复又容易出错,因为用户可能会调用
convert ext1_to_ext3 file.ext1 file.ext2 --args
我更希望子解析器是从主解析器自动确定的,以便用户可以使用命令
convert file.ext1 file.ext2 EXTRA
和argparse
将从file.ext1
和file.ext2
确定子解析器ext1_to_ext2
并调用子解析器ext1_to_ext2
来解析 EXTRA
。当然这里的EXTRA
是特定于子解析器的。
我尝试为每个转换器使用参数组(add_argument_group
),但是参数组中的参数不能重叠,并且我从所有解析器中得到了一个困惑的组合参数列表,因此使用子解析器似乎是要走的路。
我尝试将 parse_known_args
与两个位置参数一起使用,确定并使用适当的子解析器来解析剩余的参数,但很难从帮助消息中向用户提供转换器及其参数的列表。
有办法做到这一点吗?
最佳答案
推断要使用的子解析器很棘手,因为在检查以下每个参数时,它需要重新实现 argparse 本身使用的大量逻辑。
一种更简单的方法是使用 subparser 命令,该命令随后允许您“类型检查”以下参数以确保它们使用正确的参数。例如
# This allows a file name ending with any of the given extensions,
# or allows "file.1" in place of "file.1.jpg"
def jpeg_file(s):
for ext in ("jpg", "jpeg"):
if s.endswith(ext) or os.path.exists("%s.%s" % (s, ext)):
return s
raise argparse.ArgumentTypeError()
def tiff_file(s):
# similar to jpeg_file
master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
jpg_to_tiff_parser = subparsers.add_parser('sub')
jpg_to_tiff_parser = parse.add_argument('jpg', type=jpg_file)
jpg_to_tiff_parser = parse.add_argument('tiff', type=tiff_file)
关于python - argparse 其他参数隐含的子解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41105192/