如果存在另一个特定的参数选择,是否有一种方法可以使要求的参数为true,否则要求的参数为false?
例如以下代码,如果参数-act choice选择为'copy',则参数dp required为true,否则为false:
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-act", "--act", required=True, choices=['tidy','copy'],type=str.lower,
help="Action Type")
ap.add_argument("-sp", "--sp", required=True,
help="Source Path")
args = vars(ap.parse_args())
if args["act"] == 'copy':
ap.add_argument("-dp", "--dp", required=True,
help="Destination Path")
else:
ap.add_argument("-dp", "--dp", required=False,
help="Destination Path")
args = vars(ap.parse_args())
### Tidy Function
def tidy():
print("tidy Function")
### Copy Function
def copy():
print("copy Function")
### Call Functions
if args["act"] == 'tidy':
tidy()
if args["act"] == 'copy':
copy()
我当前遇到无法识别的错误:-dp,上面的代码。
预期结果将继续进行调用功能。谢谢
答案 0 :(得分:0)
我将使用ArgumentParser.add_subparsers
定义操作类型{tidy, copy}
并为命令提供特定的参数。使用base parser with parents可以定义两个(或全部)子命令共享的参数。
import argparse
parser = argparse.ArgumentParser(
prog='PROG',
epilog="See '<command> --help' to read about a specific sub-command."
)
base_parser = argparse.ArgumentParser(add_help=False)
base_parser.add_argument("--sp", required=True, help="source")
subparsers = parser.add_subparsers(dest='act', help='Sub-commands')
A_parser = subparsers.add_parser('copy', help='copy command', parents=[base_parser])
A_parser.add_argument('--dp', required=True, help="dest, required")
B_parser = subparsers.add_parser('tidy', help='tidy command', parents=[base_parser])
B_parser.add_argument('--dp', required=False, help="dest, optional")
args = parser.parse_args()
if args.act == 'copy':
pass
elif args.act == 'tidy':
pass
print(args)
其中会生成以下帮助页面,请注意,该命令无需使用-act
,而是作为位置参数给出的。
~ python args.py -h
usage: PROG [-h] {tidy,copy} ...
positional arguments:
{tidy,copy} Sub-commands
tidy tidy command
copy copy command
optional arguments:
-h, --help show this help message and exit
See '<command> --help' to read about a specific sub-command.
~ python args.py copy -h
usage: PROG copy [-h] --sp SP [--dp DP]
optional arguments:
-h, --help show this help message and exit
--sp SP source
--dp DP dest, optional
~ python args.py tidy -h
usage: PROG tidy [-h] --sp SP --dp DP
optional arguments:
-h, --help show this help message and exit
--sp SP source
--dp DP dest, required
答案 1 :(得分:-1)
ap.add_argument("-dp", "--dp", help="Destination Path")
args = parser.parse_args()
if args.copy is in ['copy']:
if args.dp is None:
parser.error('With copy, a dp value is required')
由于用户无法将值设置为None
,因此is None
是对未使用的参数的很好的测试。
解析器具有已定义参数parser._actions
的列表。每个都有一个required
属性。在解析期间,它会维持set
个可见动作。解析结束时,它仅针对actions
为required
的{{1}}来检查此集合,如果有则发出错误消息。
我认为解析后的测试比尝试预先设置True
参数要简单。
一种替代方法是为required
提供合理的默认值。然后,您将不在乎用户是否提供值。
我可以想象为dp
定义一个自定义Action
类,该类将设置copy
的{{1}}属性,但总的来说会更多。