Python 如何在argparse中指定同一类型父解析器的多个实例

Python 如何在argparse中指定同一类型父解析器的多个实例,python,Python,我正在从Perl转换到Python的一些应用程序有一个相当聪明的参数解析系统,其中带有指定前导子字符串(“前缀”)的命令选项(如“-xyz-…”)被识别并作为标准集的一部分进行处理。因此,这似乎非常适合argparse的Python“家长”功能 但是,Perl代码还允许同一类型标准集的多个实例,并且不清楚是否可以或如何扩展此argparse父功能来处理该问题 所以我需要的是: from xyz import parser # instance 1 (options start -xyz1-..)

我正在从Perl转换到Python的一些应用程序有一个相当聪明的参数解析系统,其中带有指定前导子字符串(“前缀”)的命令选项(如
“-xyz-…”
)被识别并作为标准集的一部分进行处理。因此,这似乎非常适合
argparse
的Python“家长”功能

但是,Perl代码还允许同一类型标准集的多个实例,并且不清楚是否可以或如何扩展此
argparse
父功能来处理该问题

所以我需要的是:

from xyz import parser # instance 1 (options start -xyz1-..)

from xyz import parser # instance 2 (options start -xyz2-..)

parser = argparse.ArgumentParser(parents=[xyz1.parser, xyz2.parser])

...
所以在这个粗略的代码大纲中需要一些方法

  • 唯一地指示同一类的每个实例,以及
  • 在每个类中指出它应该处理的选项的唯一前缀

  • 这似乎是你想要的

    main.py: xyz1.py xyz2.py 结果:
    $python main.py
    用法:main.py[-h][-xyz1猫][-xyz1狗][-xyz2蜥蜴][-xyz2蜥蜴]
    [-s天空]
    我的节目
    可选参数:
    -h、 --帮助显示此帮助消息并退出
    -xyz1猫
    -xyz1狗
    -xyz2蜥蜴
    -xyz2斯波克
    -天空,天空
    
    编辑 根据OP的评论,“我只想要一个可以参数化的xyz.py模块”,这可能是他想要的:

    main.py xyz.py
    请提供实际代码,而不是伪代码,以说明您遇到的问题。看见特别是,您的
    import
    语句是相同的。为什么您希望它们引用不同的对象?您的姓名
    xyz1
    xyz2
    未定义。它们指的是什么?感谢您的及时回复,Rob,但我的问题不在于代码语法(尽管作为python新手,我会在回复中发现一个工作代码的示例很有用!)。正如我所说,“伪代码”只是一个草图,给出了我想要做的粗略想法;也许省略它会更好。进一步研究argparse文档,我想知道“组”功能是否与我的问题无关。我想我明白你的要求了。您希望
    import
    参数化,并且希望多个
    import
    s重新导入模块。Python不是这样工作的。模块只导入一次,不管有多个
    import
    语句,并且您不能传递参数。是的,我有一种感觉就是这样。唯一的问题是,我只想要一个可以参数化的xyz.py模块,以使用导入代码指定的前缀,然后在后者(“主”脚本)中导入该模块的两个实例,为每个实例指定唯一的前缀。模块是单例的。一个模块不能“导入两个实例”。您可以导入一个模块,该模块包含一个可以使用参数调用的类或函数,然后调用该函数两次。请参阅我对带有参数化
    解析器
    函数的模块的答案的编辑。非常感谢Rob。我已将你的答案标记为首选答案,
    import argparse
    import xyz1
    import xyz2
    
    parser = argparse.ArgumentParser(
        description="My program",
        parents=[xyz1.parser, xyz2.parser])
    parser.add_argument("-s", "--sky")
    parser.parse_args(["--help"])
    
    import argparse
    
    parser = argparse.ArgumentParser(description="XYZ1 args", add_help=False)
    parser.add_argument("-xyz1-cat", action='store_true')
    parser.add_argument("-xyz1-dog", action='store_true')
    
    import argparse
    
    parser = argparse.ArgumentParser(description="XYZ2 args", add_help=False)
    parser.add_argument("-xyz2-lizard", action='store_true')
    parser.add_argument("-xyz2-spock", action='store_true')
    
    import argparse
    import xyz
    
    parser = argparse.ArgumentParser(
        description="My program",
        parents=[xyz.parser("xyz1"), xyz.parser("xyz2")])
    parser.add_argument("-s", "--sky")
    parser.parse_args(["--help"])
    
    import argparse
    
    def parser(prefix):
        result = argparse.ArgumentParser(add_help=False)
        result.add_argument("--%s-cat"%prefix, action='store_true')
        result.add_argument("--%s-dog"%prefix, action='store_true')
        return result