【问题标题】:Removing arguments from python/argparse (without using parse_known_args)从 python/argparse 中删除参数(不使用 parse_known_args)
【发布时间】:2017-12-18 10:12:29
【问题描述】:

我有两个程序,一个是另一个的包装器。

主程序有args order-arg-one, --arg1, --arg2 Wrapper 程序具有主程序的所有参数,以及附加参数 --arg3 , --arg4

我希望能够将参数从包装器传递到主程序,而不会出现“参数无法识别”错误。但是,我确实想使用 parse_known_args,因为如果用户打错字或使用了无意义的参数,他们将收到零反馈。 (我已经看过this question

除了手动搜索每个单独的参数名称,然后在该名称存在时紧跟在该名称之后的任何值,并且它的参数需要后面的参数,有没有更优雅的方法来清理我的一些参数一组值以便将它们传递给另一个解析器?

【问题讨论】:

  • 给出一些示例代码以明确发生了什么。如果包装器处理所有参数,则 main 是否忽略它无法处理的参数并不重要。在链接的答案中,第一个解析器使用部分,并将附加内容传递给第二个。您可以尝试使用虚拟解析器捕获 arg3/4 并将其余部分作为其 extras 传递。

标签: python argparse


【解决方案1】:

混合各种部分解析的例子:

import argparse

def foo(parser, alist):
   for arg in alist:
        parser.add_argument('--'+arg, action='store_true')

parser1 = argparse.ArgumentParser()
foo(parser1, ['arg1','arg2'])

parser2 = argparse.ArgumentParser()
foo(parser2, ['arg3','arg4'])

parser12 = argparse.ArgumentParser()
foo(parser12, ['arg1','arg2','arg3','arg4'])

args = parser12.parse_args()
print('p12', args)

args, extras = parser2.parse_known_args()
print('p2',args, extras)

args = parser1.parse_args(extras)
print('p1',args)

args, extras = parser1.parse_known_args()
print('p1p',args, extras)

无:

1714:~/mypy$ python3 stack47866170.py 
p12 Namespace(arg1=False, arg2=False, arg3=False, arg4=False)
p2 Namespace(arg3=False, arg4=False) []
p1 Namespace(arg1=False, arg2=False)
p1p Namespace(arg1=False, arg2=False) []

全部:

1722:~/mypy$ python3 stack47866170.py --arg1 --arg2 --arg3 --arg4
p12 Namespace(arg1=True, arg2=True, arg3=True, arg4=True)
p2 Namespace(arg3=True, arg4=True) ['--arg1', '--arg2']
p1 Namespace(arg1=True, arg2=True)
p1p Namespace(arg1=True, arg2=True) ['--arg3', '--arg4']

子集

1723:~/mypy$ python3 stack47866170.py --arg1 --arg2
p12 Namespace(arg1=True, arg2=True, arg3=False, arg4=False)
p2 Namespace(arg3=False, arg4=False) ['--arg1', '--arg2']
p1 Namespace(arg1=True, arg2=True)
p1p Namespace(arg1=True, arg2=True) []
1723:~/mypy$ python3 stack47866170.py --arg1 --arg3
p12 Namespace(arg1=True, arg2=False, arg3=True, arg4=False)
p2 Namespace(arg3=True, arg4=False) ['--arg1']
p1 Namespace(arg1=True, arg2=False)
p1p Namespace(arg1=True, arg2=False) ['--arg3']

错误 - 被 parser12 捕获:

1724:~/mypy$ python3 stack47866170.py --arg1 --foo
usage: stack47866170.py [-h] [--arg1] [--arg2] [--arg3] [--arg4]
stack47866170.py: error: unrecognized arguments: --foo

【讨论】:

  • 这仅适用于可选参数,但如果每个解析器都有位置参数,则它不是解决方案......尽管如此,接受
  • 是的,当使用多个解析器时,位置将很难处理。如果只解析这些,它可能会起作用。
  • 使用多个解析器解析相同的参数是一个有趣的想法。在某些情况下,它可能非常有用。 --- 不利的一面是我需要将相同(更复杂)的参数定义放到多个解析器中。有没有一种简单的方法可以将参数定义(我认为它由 argparse.Action 对象表示)从一个解析器复制到另一个解析器?
  • @pabouk,parents 机制执行此操作 - 将 Action 引用从父级复制到子级。我不记得哪个方法可以做到这一点(可能在 Actions_container 类中)。因此,即使您不想使用 parents,您也可以从中复制想法。
猜你喜欢
  • 2021-09-04
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多