Python 3.x Python3 argparse:如何在一个位置参数中接受所有浮点值和字符串列表?

Python 3.x Python3 argparse:如何在一个位置参数中接受所有浮点值和字符串列表?,python-3.x,argparse,Python 3.x,Argparse,在不描述我的程序真正做什么的情况下,让我讲一个假用例,它应该足以证明我预期的参数用法 假设我正在构建一个报警程序(同样,这是一个假的用例,所以请不要告诉我Linux/Windows中有本机报警)。它可以在特定的预定义时间(如“上午”、“中午”)和给定的分钟数后报警。我希望我的命令接受以下用例: $ python alarm_at.py morning $ python alarm_at.py noon $ python alarm_at.py evening $ python alarm_at.

在不描述我的程序真正做什么的情况下,让我讲一个假用例,它应该足以证明我预期的参数用法

假设我正在构建一个报警程序(同样,这是一个假的用例,所以请不要告诉我Linux/Windows中有本机报警)。它可以在特定的预定义时间(如“上午”、“中午”)和给定的分钟数后报警。我希望我的命令接受以下用例:

$ python alarm_at.py morning
$ python alarm_at.py noon
$ python alarm_at.py evening
$ python alarm_at.py 1
$ python alarm_at.py 2
$ python alarm_at.py 3
...
约束条件是,我只想为此使用一个位置参数。此外,可能还有其他我需要的位置参数,因此应该允许这样的情况:

$ python alarm_at.py loud morning long
$ python alarm_at.py low 3 short
在上面的例子中,我有两个虚构的位置参数,分别用于响度和报警声的长度。

如果您进行检查,您会发现:

type=可以接受任何接受单个字符串参数并返回转换值的可调用项

因此,您可以创建一个接受所需值的函数,并将其设置为参数类型。 无论您刚刚按正确的顺序设置了多少个位置参数,也不管是否需要。

如果您进行检查,您会发现:

type=可以接受任何接受单个字符串参数并返回转换值的可调用项

因此,您可以创建一个接受所需值的函数,并将其设置为参数类型。
不管您有多少个位置参数,只要按正确的顺序设置它们,并且
是否需要

这正是我需要知道的。代码片段帮助很大。总之,我们可以使用
ArgumentTypeError
拒绝无效值,甚至在函数中进行一些转换。我很高兴它对您有所帮助;-)非常感谢你,埃皮纳尔。:)另外,我不知道“%r”表示法,它在创建要引用值的错误消息时非常有用。所以,向你竖起大拇指。这正是我需要知道的。代码片段帮助很大。总之,我们可以使用
ArgumentTypeError
拒绝无效值,甚至在函数中进行一些转换。我很高兴它对您有所帮助;-)非常感谢你,埃皮纳尔。:)另外,我不知道“%r”表示法,它在创建要引用值的错误消息时非常有用。所以,为你竖起两个大拇指。
>>> def perfect_square(string):
...     value = int(string)
...     sqrt = math.sqrt(value)
...     if sqrt != int(sqrt):
...         msg = "%r is not a perfect square" % string
...         raise argparse.ArgumentTypeError(msg)
...     return value
...
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', type=perfect_square)
>>> parser.parse_args(['9'])
Namespace(foo=9)
>>> parser.parse_args(['7'])
usage: PROG [-h] foo
PROG: error: argument foo: '7' is not a perfect square