Python将多个参数放入互斥组中



我想实现这样的东西,

usage: main.py [-h] [--video_link video | --channel_link channel --num_vids num ]

选项——num_vids只有在我使用——channel_link选项时才需要。

我只能这样,

parser = argparse.ArgumentParser(
description='A Python script to download Youtube videos')
group_ = parser.add_mutually_exclusive_group()
group_.add_argument('--video_link',
metavar='video',
type=str,
help='Enter the video url')
group_.add_argument('--channel_link',
metavar='channel_link',
type=str,
help='Enter the name of the channel')
args = parser.parse_args()
video_link = args.video_link
channel_link = args.channel_link
print(video_link, channel_link)

如何实现所需的功能?

argparse支持子命令,这些子命令类似于位置参数,可以有自己的选项。每次调用只能指定一个子命令(尽管子命令可以使用它们自己的子命令),但这意味着子命令的行为很像互斥组。子命令也是可选的,因此在运行脚本时根本不需要指定子命令。(不过,您可以通过向add_subparsers传递适当的参数使其成为必需。)如果您需要区分两种类型的url,则使用set_defaults将目标注入到解析的参数中,以指示使用了哪个子命令(如果有的话),例如:

parser = argparse.ArgumentParser(
description='A Python script to download Youtube videos')
sp = parser.add_subparsers()
p.set_defaults(choice=None)
p1 = sp.add_parser('video_link',
metavar='video',
help='Enter the video url')
p1.set_defaults(choice='video')
p1.add_argument('url', help='Video url')
p2 = sp.add_parser('channel_link',
metavar='channel_link',
help='Enter the name of the channel')
p2.add_argument('url', help='Channel url')
p2.add_argument('--num-vids', type=int)
args = parser.parse_args()

只需将num_vids参数作为可选参数添加到主解析器中,默认值为0。然后,如果您希望它看起来像某种方式,您可以编写自己的用法。

parser = argparse.ArgumentParser(
description='A Python script to download Youtube videos', 
usage='main.py [-h] [--video_link video | --channel_link channel --num_vids num ]'
)
group_ = parser.add_mutually_exclusive_group()
group_.add_argument('--video_link',
metavar='video',
type=str,
help='Enter the video url')
group_.add_argument('--channel_link',
metavar='channel_link',
type=str,
help='Enter the name of the channel')
parser.add_argument('--num_vids', 
action='store', 
help='Only applies when also using --channel_link',
type=int,
default=0,
nargs='?',
const=0)
args = parser.parse_args()
video_link = args.video_link
channel_link = args.channel_link
print(video_link, channel_link)

最新更新