python - 如何在 argparse 中指定相同类型的父解析器的多个实例

标签 python

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

但是,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])

...

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

  1. 唯一地指示同一类的每个实例,并且
  2. 在每个类中指示它应该处理的选项的唯一前缀。

最佳答案

这似乎符合您的要求。

main.py:

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"])

xyz1.py

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

xyz2.py

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

结果:

$ python main.py 
usage: main.py [-h] [-xyz1-cat] [-xyz1-dog] [-xyz2-lizard] [-xyz2-spock]
               [-s SKY]

My program

optional arguments:
  -h, --help         show this help message and exit
  -xyz1-cat
  -xyz1-dog
  -xyz2-lizard
  -xyz2-spock
  -s SKY, --sky SKY

编辑

根据 OP 的评论,“我只想要一个可以参数化的 xyz.py 模块”,这可能就是他想要的:

main.py

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"])

xyz.py

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

关于python - 如何在 argparse 中指定相同类型的父解析器的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33262526/

相关文章:

python - pyplot 轴标题不显示

python - 如何打印列表中字符串中的单词?在 Python 中

python - 如何从相关模型中检查两个或多个参数?

python - 我如何将 matplotlib 与 igraph 一起使用?

python - 当某个应用程序在 Python 中启动时如何触发函数

python - 字符串格式选项 : pros and cons

python - 仅在特定时间合并两个数据帧

python - Pandas:难以填充空值

python - 使用 while 函数创建和命名文件

python - 根据Python Pandas数据框中的日期计算距下一个假期和自上个假期以来的天数?