如何在Python的Argparse中将可选参数设置为位置参数?

时间:2019-07-15 11:16:12

标签: python argparse

我有以下代码:

# Get parsed arguments
args = argparse.ArgumentParser(description=Messages().Get(112))

# Get the arguments for sinit
args.add_argument('init', help=Messages().Get(100), action="store_true")
args.add_argument('--url', default=None, help=Messages().Get(101))

# Get the arguments for schema import
args.add_argument('schema-import', help=Messages().Get(104), action="store_true")
args.add_argument('--file', default=None, help=Messages().Get(104))

--url参数只能与init一起使用。例如:script.py schema-import --url应该不被接受,但是script.py schema-import --file应该被接受。

如何将参数设置为子参数?

2 个答案:

答案 0 :(得分:1)

如前所述,我不确定使用argparse可以做到这一点,但是无论如何,我发现在应用程序逻辑中显式处理参数依赖项更加透明。这应该可以实现我认为想要的:

import argparse
import sys

args = argparse.ArgumentParser(description="please only use the '--url' argument if you also use the 'init' argument")
# Going to use aliases here it's more conventional. So user can use, eg,
# -i or --init for the first argument.

args.add_argument('-i', '--init', help='init help', action="store_true")
args.add_argument('-u', '--url', default=None, help='init help')

args.add_argument('-s', '--schema-import', help='schema-import help', action="store_true")
args.add_argument('-f', '--file', help='file help')


def main():
    arguments = args.parse_args()

    if arguments.url and not arguments.init:
        # You can log an output or raise an exception if you want
        # But most likely a print statment is most appropriate
        # Since you are interacting with the CLI.
        print("You can only use the URL option with init. Exiting")
        sys.exit(0)

    print("gaurd clauses passed. Here is my code...")
    ...


if __name__ == "__main__":
    main()

测试结果(我的文件名为temp.py):

$python temp.py -u https://www.google.com
You can only use the URL option with init. Exiting
$

$python temp.py -i -u https://www.google.com
Gaurd clauses passed. Here is my code...

答案 1 :(得分:0)

当您让argparse为您完成所有工作时,为什么还要烦恼所有逻辑呢?

只需使用Sub-commands来定义不同的执行“分支”:

args = argparse.ArgumentParser(description=Messages().Get(112))
subparsers = args.add_subparsers()

parser_init = subparsers.add_parser('init', help=Messages().Get(100))
parser_init.add_argument('--url', default=None, help=Messages().Get(101))

parser_schema = subparsers.add_parser('schema-import', help=Messages().Get(104))
parser_schema.add_argument('--file', default=None, help=Messages().Get(104))

这将为您提供所需的内容,而无需添加任何逻辑:

>>> print(args.parse_args(['schema-import', '--url', "some.url"]))
usage: args.py [-h] {init,schema-import} ...
args.py: error: unrecognized arguments: --url some.url
>>> print(args.parse_args(['schema-import', '--file', "some.file"]))
Namespace(file='some.file')