arg类型和复杂解析器

2024-04-23 09:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为我的用户提供添加多个复杂对象的可能性,例如:库对象将是:

  • 图书馆名称
  • 图书馆号码
  • 。。。在

为此,我所做的是用append操作设置一个parameter-library,并向参数添加一个类型,以便它以正确的格式读取它,这将导致以下命令行: --library“library_name=test;library_number=5”,library type函数将测试并执行工作,但这不是一个很好的方法,还有其他方法可以做我想要的吗?在

我想像这样使用纳格:

--library test 5

这在我看来更好,但是我要关联的类型函数不能是一个复杂的函数,因为它是在返回数组的每个值上运行的!在

有什么想法吗?在


我应该再解释一下我想做什么。我正在开发一个工作流管理器引擎。它指定一个属性文件,其中定义所有参数,并解析此参数列表以构建正确的argparse对象。在

例如,我可以将库参数定义为前面定义的: 图书馆_姓名.姓名= ... 图书馆_名称.帮助= ... 图书馆_名称.类型=结构 图书馆_名称。必需=正确

^{pr2}$

但是我希望这个对象设置为用户想要的库的任意数量,这样我就可以在这些选项中添加一个append操作,但是用户必须以正确的顺序提供所有输入:

--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

清楚了吗?在


我应该再解释一下,我改变了你给我的内容,这样用户就可以——库库名称=测试库编号=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)

此类型使用参数为的哈希表_名称:类型,我可以添加所需字段以便进行检查。但我确实需要知道什么时候结束,以检查所需的参数在哪里设置。 有可能吗?在


Tags: 对象函数用户nameself名称类型number
3条回答

您可以创建一个非常简单的状态机:

class NargsTypeChecker(object):
    def __init__(self, types):
        self.types = types
        self.index = 0
    def __repr__(self):
        return self.types[self.index].__name__
    def __call__(self, arg):
        value = self.types[self.index](arg)
        self.index = (self.index + 1) % len(self.types)
        return value

用作:

^{pr2}$

以及一些错误输出:

$python3 complex_type.py --library lib 1 3.6
Namespace(library=['lib', 1, 3.6])
$python3 complex_type.py --library lib other 3.6
usage: complex_type.py [-h] [--library LIBRARY LIBRARY LIBRARY]
complex_type.py: error: argument --library: invalid int value: 'other'
$python3 complex_type.py --library lib 2 other
usage: complex_type.py [-h] [--library LIBRARY LIBRARY LIBRARY]
complex_type.py: error: argument --library: invalid float value: 'other'

如果可以接受以下格式:--library lib1:1--library lib2:2

def libType(ls):
    name, num = ls.split(':')
    return name, int(num)

parser.add_argument("--library", action = "append", type=libType)
# you get: Namespace(library=[('lib1', 1), ('lib2', 2)])

如果您喜欢使用:--library lib1 1-library lib2 2 2

^{pr2}$

然后,您必须执行额外的类型检查以获取int而不是str

如果库名称中不包含空格,则只需使用一个字符串即可

library = argstring.split()

这将返回一个列表library,名称为library[0],编号为library[1]。在

相关问题 更多 >