python argparse如果选择了参数,则需要另一个参数= True

时间:2019-12-06 22:47:00

标签: python-3.x argparse

如果存在另一个特定的参数选择,是否有一种方法可以使要求的参数为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,上面的代码。

预期结果将继续进行调用功能。谢谢

2 个答案:

答案 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个可见动作。解析结束时,它仅针对actionsrequired的{​​{1}}来检查此集合,如果有则发出错误消息。

我认为解析后的测试比尝试预先设置True参数要简单。

一种替代方法是为required提供合理的默认值。然后,您将不在乎用户是否提供值。

我可以想象为dp定义一个自定义Action类,该类将设置copy的{​​{1}}属性,但总的来说会更多。