一般来说,你应该避免使--optionsrequired。在这种情况下,我建议如下:
- 替换
--mode为子命令。 
- 替换
-d为位置参数 
- 仅替换
-f为download命令的第二个位置参数。 
如果你真的想要,你可以保留-d而-f不是让它们成为位置参数。
您的电话将如下所示:
./script.py upload d-argument
./script.py download d-argument f-argument
或者
./script.py upload -d foo
./script.py download -d foo -f bar
要实现的代码有点乏味,但相当简单。
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
upload_parser = subparsers.add_parser('upload')
download_parser = subparsers.add_parser('download')
upload_parser.set_defaults(cmd='upload')
download_parser.set_defaults(cmd='download')
for p in [ upload_parser, download_parser ]:
    p.add_argument("d")
    # p.add_argument("-d", required=True)
download_parser.add_argument("f")
# download_parser.add_argument("-f", required=True)
args = parser.parse_args()
if args.cmd == 'upload':
    # handle upload with args.d
elif args.cmd == 'download':
    # handle download with args.d and args.f
注意set_defaults用于在最终解析的参数中标记使用了哪个命令的调用。