Argparse:如果存在“x”,则需要参数“y”

2025-03-18 08:54:00
admin
原创
46
摘要:问题描述:我有如下要求:./xyifier --prox --lport lport --rport rport 对于参数 prox ,我使用 action='store_true' 来检查它是否存在。我不需要任何参数。但是,如果设置了 --prox ,我还需要rport 和 lport 。有没有一种简单的方...

问题描述:

我有如下要求:

./xyifier --prox --lport lport --rport rport

对于参数 prox ,我使用 action='store_true' 来检查它是否存在。我不需要任何参数。但是,如果设置了 --prox ,我还需要rport 和 lport 。有没有一种简单的方法可以使用 argparse 来做到这一点,而无需编写自定义条件编码。

更多代码:

non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy')
non_int.add_argument('--lport', type=int, help='Listen Port.')
non_int.add_argument('--rport', type=int, help='Proxy port.')

解决方案 1:

不,argparse 中没有任何选项可以创建互相包含的选项集。

处理这个问题最简单的方法是:

if args.prox and (args.lport is None or args.rport is None):
    parser.error("--prox requires --lport and --rport.")

实际上已经有一个开放的 PR 和一个增强建议:
https://github.com/python/cpython/issues/55797

解决方案 2:

你说的是具有条件性必需参数。就像 @borntyping 所说的那样,你可以检查错误并执行,或者你可以只应用与添加新参数时parser.error()相关的要求。--prox

对于你的例子的一个简单解决方案可能是:

non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy')
non_int.add_argument('--lport', required='--prox' in sys.argv, type=int)
non_int.add_argument('--rport', required='--prox' in sys.argv, type=int)

这种方式required接收TrueFalse取决于用户是否使用--prox。这也保证了-lport-rport彼此之间具有独立的行为。

解决方案 3:

如何使用parser.parse_known_args()方法,然后添加--lport--rport参数作为必需的参数(如果--prox存在)。

# just add --prox arg now
non_int = argparse.ArgumentParser(description="stackoverflow question", 
                                  usage="%(prog)s [-h] [--prox --lport port --rport port]")
non_int.add_argument('--prox', action='store_true', 
                     help='Flag to turn on proxy, requires additional args lport and rport')
opts, rem_args = non_int.parse_known_args()
if opts.prox:
    non_int.add_argument('--lport', required=True, type=int, help='Listen Port.')
    non_int.add_argument('--rport', required=True, type=int, help='Proxy port.')
    # use options and namespace from first parsing
    non_int.parse_args(rem_args, namespace = opts)

还请记住,您可以opts在第二次解析剩余参数时提供第一次解析后生成的命名空间。这样,最终,在完成所有解析后,您将拥有一个包含所有选项的命名空间。

缺点:

  • 如果--prox不存在,则其他两个依赖选项甚至不会出现在命名空间中。尽管根据您的用例,如果--prox不存在,则其他选项会发生什么无关紧要。

  • 需要修改使用信息,因为解析器不知道完整结构

  • --lport并且--rport不会出现在帮助信息中

解决方案 4:

您是否在未设置lport时使用。如果没有,为什么不使用和参数?例如prox`lportrportprox`

parser.add_argument('--prox', nargs=2, type=int, help='Prox: listen and proxy ports')

if args.prox is not None:这可节省用户的输入时间。测试起来非常简单if args.prox:

解决方案 5:

接受的答案对我来说非常有用!由于所有代码在没有测试的情况下都会被破坏,下面是我测试接受答案的方法。parser.error()不会引发argparse.ArgumentError错误,而是退出进程。你必须测试SystemExit

使用 pytest

import pytest
from . import parse_arguments  # code that rasises parse.error()


def test_args_parsed_raises_error():
    with pytest.raises(SystemExit):
        parse_arguments(["argument that raises error"])

使用单元测试

from unittest import TestCase
from . import parse_arguments  # code that rasises parse.error()

class TestArgs(TestCase):

    def test_args_parsed_raises_error():
        with self.assertRaises(SystemExit) as cm:
            parse_arguments(["argument that raises error"])

灵感来自:使用 unittest 测试 argparse - 退出错误

解决方案 6:

我这样做了:

if t or x or y:
    assert t and x and y, f"args: -t, -x and -y should be given together"
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用