我想为我的用户提供添加多个复杂对象的可能性,例如:Library 对象将是:
- 图书馆名称
- 图书馆号
- ...
为此,我所做的是设置一个带有附加操作的参数 --library 并向参数添加一个类型,以便它以正确的格式读取它,这会导致以下命令行: --library "library_name=test;library_number =5”,库类型函数将测试并完成工作,但这并不是一个很好的方法,还有其他方法可以做我想要的吗?
我想像这样使用nargs:
--library test 5
这对我来说看起来更好,但是我想关联的类型函数不能是复杂的,因为它在返回数组的每个值上运行!
任何的想法?
我应该多解释一下我正在尝试做的事情。我正在开发工作流管理器引擎。这一个指定了一个属性文件,其中定义了所有参数,并且该参数列表被解析以构建正确的 argparse 对象。
例如,我可以像之前定义的那样定义我的库参数: library_name.name = ... library_name.help = ... library_name.type = str library_name.required = True
library_number.name = ...
library_number.help = ...
library_number.type = int
library_number.required = True
...
但是我希望这个对象设置与用户想要的库一样多,所以我可以向这些选项添加一个附加操作,但用户必须以正确的顺序提供所有输入:
--library-name lib1 --library-number 1 --library-name lib2 --library-number 2
但这对用户来说并不容易,我所做的是:
--library "name=lib1;number=1" --library "name=lib2;number=2"
但这不是“漂亮”,我更喜欢这样的东西,但我仍然想检查这是否是正确的格式:
--library lib1 1 --library lib2 2
这更清楚吗?
我应该再解释一下,我更改了您给我的内容,以便用户可以--library library-name=test library-number=5,因此不需要提供所有字段,但是我希望其中一些是必需的,但要这样做,我需要知道一旦检查了所有参数是否已解决所需的参数
class MiltipleParameters(object):
def __init__(self, types):
self.types = types
self.index = None
self.__name__ = "MiltipleParameters"
def __call__(self, arg):
parts = arg.split("=")
if not self.types.has_key(parts[0]):
raise argparse.ArgumentTypeError(parts[0] + " is an invalid flag! Available ones are: "+", ".join(self.types.keys()))
try:
value = self.types[parts[0]](parts[1])
except:
raise argparse.ArgumentTypeError("invalid " + self.types[parts[0]].__name__ + " value: '" + parts[1] + "' for sub parameter '" + parts[0] + "'")
self.index = parts[0]
return (parts[0], value)
这种类型采用带有 param_name:type 的哈希表,我可以添加必填字段以便对其进行检查。但我确实需要知道何时结束检查所需的参数是否设置在哪里。是否可以 ?