gpt4 book ai didi

python:互斥位置参数

转载 作者:行者123 更新时间:2023-11-28 19:11:44 28 4
gpt4 key购买 nike

我希望我的程序接受相互排斥的位置参数,并且用法显示为一组参数。
目前我只能实现一个或另一个,但不能同时实现......

这是我目前拥有的:

def parse_arguments():
arg_parser = argparse.ArgumentParser(description = 'Project Builder')

query_parser = arg_parser.add_argument_group('query', "Query current state")
build_parser = arg_parser.add_argument_group('build', "Build project")

# query arguments
query_parser.add_argument('-s', '--servers',
action = 'store_true',
required = False,
help = 'Display available servers')

query_parser.add_argument('-u', '--users',
action = 'store_true',
required = False,
help = 'Display current users')



# build arguments
build_parser.add_argument('-f', '--force',
action = 'store',
required = False,
metavar = 'SERVER_NAME',
help = 'Force build on SERVER_NAME')

build_parser.add_argument('-c', '--clean',
action = 'store_true',
required = False,
help = 'Clean repo before build')

build_parser.add_argument('-v', '--verbosity',
action = 'store_true',
required = False,
help = 'Print stderr to console')

build_parser.add_argument('-p', '--project',
action = 'store',
required = True,
metavar = 'project_A|project_B|project_C',
type = project_name,
help = 'Project to build (required)')

return vars(arg_parser.parse_args())


args = parse_arguments()

给出以下内容:

usage: test.py [-h] [-s] [-u] [-f SERVER_NAME] [-c] [-v] -p
project_A|project_B|project_C

Project Builder

optional arguments:
-h, --help show this help message and exit

query:
Query current state

-s, --servers Display available servers
-u, --users Display current users

build:
Build project

-f SERVER_NAME, --force SERVER_NAME
Force build on SERVER_NAME
-c, --clean Clean repo before build
-v, --verbosity Print stderr to console
-p project_A|project_B|project_C, --project project_A|project_B|project_C
Project to build (required)

但我真正想要的是 querybuild 是两个互斥的位置参数。

我尝试如下使用子解析器:

def parse_arguments():
arg_parser = argparse.ArgumentParser(description = 'Project Builder')
command_parser = arg_parser.add_subparsers(help = "Command")

query_parser = command_parser.add_parser('query', help = "Query current state")
build_parser = command_parser.add_parser('build', help = "Build project")

# query arguments
query_parser.add_argument('-s', '--servers',
action = 'store_true',
required = False,
help = 'Display available servers')

query_parser.add_argument('-u', '--users',
action = 'store_true',
required = False,
help = 'Display current users')



# build arguments
build_parser.add_argument('-f', '--force',
action = 'store',
required = False,
metavar = 'SERVER_NAME',
help = 'Force build on SERVER_NAME')

build_parser.add_argument('-c', '--clean',
action = 'store_true',
required = False,
help = 'Clean repo before build')

build_parser.add_argument('-v', '--verbosity',
action = 'store_true',
required = False,
help = 'Print stderr to console')

build_parser.add_argument('-p', '--project',
action = 'store',
required = True,
metavar = 'project_A|project_B|project_C',
type = project_name,
help = 'Project to build (required)')

return vars(arg_parser.parse_args())

但这会产生以下结果:

usage: test.py [-h] {query,build} ...

Project Builder

positional arguments:
{query,build} Command
query Query current state
build Build project

optional arguments:
-h, --help show this help message and exit

我想要的是上述两种尝试的组合,即:

usage: test.py [-h] {query,build} ...

Project Builder

optional arguments:
-h, --help show this help message and exit

query:
Query current state

-s, --servers Display available servers
-u, --users Display current users

build:
Build project

-f SERVER_NAME, --force SERVER_NAME
Force build on SERVER_NAME
-c, --clean Clean repo before build
-v, --verbosity Print stderr to console
-p project_A|project_B|project_C, --project project_A|project_B|project_C
Project to build (required)

querybuild 是互斥的。
我知道 ArgumentParser.add_mutually_exclusive_group(required=False) 方法,但使用它无助于实现我想要的,因为 1) 使用它时参数必须是可选的,以及 2) usage 格式不是我想要的。

最佳答案

在第一种情况下,你可以给 -p 选择

build_parser.add_argument('-p', '--project',
action = 'store', # default
required = True,
choices = ['project_A','project_B','project_C'],
# type = project_name, # doesn't make sense
help = 'Project to build (required)')

或作为位置

build_parser.add_argument('project',
choices = ['project_A','project_B','project_C'],
help = 'Project to build')

type 必须是一个函数,可以将字符串转换成你想要的东西,例如 int('1'), float('12.343')

子解析器的使用类似。对于主解析器,子解析器参数只是一个带有选择的位置。但所采取的行动是将其余参数的解析委托(delegate)给子解析器。

两个互斥的位置没有逻辑意义

 `[foo | bar]`

它无法仅根据位置来判断您是要将字符串分配给 foo 还是分配给 bar。但是您有兴趣根据值分配值,或者更确切地说,将值限制为一组选择。

如果不仔细查看,您的子解析器代码看起来是正确的,并且应该按照您的需要解析输入。你测试过吗?

子解析器的帮助显示并不像它应该的那样灵活,但重新设计它需要大量的工作(关于这个有 SO 问题)。当前的设置是为主解析器和每个子解析器提供单独的帮助显示。没有内置的综合帮助显示。

关于python:互斥位置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39180785/

28 4 0