我怎样才能最有效地解析 python 中的这些参数?
How can I most efficiently parse these arguments in python?
所以我正在尝试使用 argparse 库提出一个策略。
以下是我想要与我的程序交互的方式:
$ program list [<number>]
$ program check <name>
$ program watch <name> [<quality>]
现在我有一个如下的参数解析器:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('list')
group.add_argument('check')
group.add_argument('watch')
但是我如何向现有参数添加一个可选参数,比如一个整数?
意味着用户可以通过以下方式调用列表命令:
program list
使用默认值调用列表操作的位置,或者:
program list 10
其中将使用参数 10 调用列表操作。
我在文档中看到了 subcommands 选项,但我 运行 遇到了一个问题,我将有一个用于列表参数的子解析器,但随后我必须添加一个标志,例如 -n 和然后提供号码。也许这是更好的方法?但我喜欢这样的想法,如果你愿意,就提供号码,如果你不想,就省略它。
我正在努力实现良好的实践吗? argparse 可以吗?
这个示例让我误入歧途。我在最后勾画了一个子解析器实现,我认为它可以解决问题。
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('list')
group.add_argument('check')
group.add_argument('watch')
它需要 3 个字符串,并将它们分配给 3 个属性。
但是,您不能将 3 个“位置”参数放在一个互斥的组中。一个可选的位置(是的,术语令人困惑)可以在这样的一组中,但其余的必须 'optionals'(标记)。
返回到您的初始列表。这些不同的图案你愿意接受吗
program list [integer]
program check name
program watch name [quality]
其中 'list'、'check'、'watch' 是文字字符串,而 'integer'、'name'、'quality' 是变量名。
如果是这样,那么 subparsers 可能是最好的选择。 nargs='?'
可用于制作位置参数 'optional'.
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='cmd') # put the command string in `cmd` attribute
p1 = sp.add_parser('list')
p2 = sp.add_parser('check')
p3 = sp.add_parser('watch')
p1.add_argument('value',dtype=int, nargs='?') # ok with 0 or 1 values
p2.add_argument('name')
p3.add_argument('name')
p3.add_argument('quality',nargs='?')
如果明确给出 none,value
和 quality
将获得默认值。默认的 default
是 None
。但是您可以定义一个有意义的替代方案,例如default=0
为整数值。
您还可以定义一个解析器,例如:
parser = ...
parser.add_argument('command', choices=['list','check','watch'])
parser.add_argument('rest', nargs='*')
这将需要 3 个 'command' 字符串之一,并将任何其他内容放入 'rest' 属性(作为字符串列表)。然后您可以根据需要解释这些字符串。
所以我正在尝试使用 argparse 库提出一个策略。
以下是我想要与我的程序交互的方式:
$ program list [<number>]
$ program check <name>
$ program watch <name> [<quality>]
现在我有一个如下的参数解析器:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('list')
group.add_argument('check')
group.add_argument('watch')
但是我如何向现有参数添加一个可选参数,比如一个整数?
意味着用户可以通过以下方式调用列表命令:
program list
使用默认值调用列表操作的位置,或者:
program list 10
其中将使用参数 10 调用列表操作。
我在文档中看到了 subcommands 选项,但我 运行 遇到了一个问题,我将有一个用于列表参数的子解析器,但随后我必须添加一个标志,例如 -n 和然后提供号码。也许这是更好的方法?但我喜欢这样的想法,如果你愿意,就提供号码,如果你不想,就省略它。
我正在努力实现良好的实践吗? argparse 可以吗?
这个示例让我误入歧途。我在最后勾画了一个子解析器实现,我认为它可以解决问题。
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('list')
group.add_argument('check')
group.add_argument('watch')
它需要 3 个字符串,并将它们分配给 3 个属性。
但是,您不能将 3 个“位置”参数放在一个互斥的组中。一个可选的位置(是的,术语令人困惑)可以在这样的一组中,但其余的必须 'optionals'(标记)。
返回到您的初始列表。这些不同的图案你愿意接受吗
program list [integer]
program check name
program watch name [quality]
其中 'list'、'check'、'watch' 是文字字符串,而 'integer'、'name'、'quality' 是变量名。
如果是这样,那么 subparsers 可能是最好的选择。 nargs='?'
可用于制作位置参数 'optional'.
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='cmd') # put the command string in `cmd` attribute
p1 = sp.add_parser('list')
p2 = sp.add_parser('check')
p3 = sp.add_parser('watch')
p1.add_argument('value',dtype=int, nargs='?') # ok with 0 or 1 values
p2.add_argument('name')
p3.add_argument('name')
p3.add_argument('quality',nargs='?')
如果明确给出 none,value
和 quality
将获得默认值。默认的 default
是 None
。但是您可以定义一个有意义的替代方案,例如default=0
为整数值。
您还可以定义一个解析器,例如:
parser = ...
parser.add_argument('command', choices=['list','check','watch'])
parser.add_argument('rest', nargs='*')
这将需要 3 个 'command' 字符串之一,并将任何其他内容放入 'rest' 属性(作为字符串列表)。然后您可以根据需要解释这些字符串。