首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中获取参数并维护and解析器的状态

在python中获取参数并维护and解析器的状态
EN

Stack Overflow用户
提问于 2015-08-25 21:19:57
回答 3查看 471关注 0票数 0

我正在尝试使用python中的am解析模块来解析参数。我有同一个实例的两个解析器对象--主解析器和辅助解析器。

使用辅助解析器解析的参数需要在运行时连接到使用主解析器解析的参数,只有在运行main parser.parseArgs()一次时才能成功地执行这些参数。

我感兴趣的是获取使用辅助解析器解析的参数的值,然后将该参数传递给主解析器。我试图运行辅助parser.parseArgs(),但这会导致问题,因为运行时与主解析器挂钩失败。我认为,我可能可以使用how解析中的命名空间对象来解决这个问题,但不知道如何解决。有人能帮忙吗?

代码语言:javascript
运行
复制
    secondaryparser=argparse.ArgumentParser()
    secondaryparser.add_Argument('--c')
    args2= secondaryparser.parseArgs()
    print args2.c

    mainparser=argparse.ArgumentParser()
    mainparser.add_Argument('--a')
    mainparser.add_Argument('--b')
    args = mainparser.parseArgs()
    print args.a, args.b

据我所知,parseArgs()查看它自己的名称空间,弹出每个参数并清空堆栈,因此第二个parseArgs()调用失败。在这种情况下,如何保存辅助解析器的状态并将参数传递给主解析器。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-25 23:08:32

下面是你想要做的事情的猜测。我将显式地使用sys.argv,所以很清楚发生了什么。

代码语言:javascript
运行
复制
import sys
print sys.argv

secondaryparser=argparse.ArgumentParser()
secondaryparser.add_argument('--c')
args2, extras2 = secondaryparser.parse_known_args(sys.argv[1:])
print args2  # diagnositic display of the Namespace
print extras
print args2.c

mainparser=argparse.ArgumentParser()
mainparser.add_argument('--a')
mainparser.add_argument('--b')
args, extras = mainparser.parse_known_args(sys.argv[1:], args2)
# args = mainparser.parse_args(extras2, args2)
print args.a, args.b
print args2  # debug
print args   # debug
print extras

secondaryparser被设置为在命令行的参数列表中查找--c。我使用的是parse_known_args,所以如果包含--a--b,它不会引发错误。如果存在,这些字符串将出现在extras2列表中。

可以用mainparser调用mainparser.parse_args(),但如果包含--c,则会引发错误。相反,我再次使用了parse_known_args,或者将extras2传递给已经删除了--cextras2

在调用之后,argsargs2应该是相同的名称空间,并且应该包含abc属性。

使用parse_known_args和命名空间参数,您可以链接多个解析器,所有这些都使用相同的输入。parse_known_args的输出是您可以访问的解析的唯一“状态”--它是包含解析字符串的命名空间,以及它无法处理的字符串列表。

解析器不是状态机。它是一个对象(类ArgparseParser),它“拥有”许多参数(argparse.Action对象)。parse_args是一个方法,它接收字符串列表,并返回一个Namespace对象。由于这个调用,parser中的任何内容都不会改变。parse_args (或parse_known_args)可以多次调用,在默认的sys.argv上反复调用(但为什么?)或者在其他(测试)输入上。

测试代码通常如下所示:

代码语言:javascript
运行
复制
 parser = argparer.ArguementParser(...)
 ....
 print (parser.parse_args([])) # to see how it behaves without any commandline values)
 print (parser.parse_args(['-f', 'foovalue'])
 args = parser.parse_args()
 print (args)
 parser.print_help()
 try:
     parser.parse_args(['bad','value'])
 except <capture error ans sys.exit>
     print (error)
票数 1
EN

Stack Overflow用户

发布于 2015-08-26 00:46:06

我解决这个问题的方法是这样的。感谢hpaulj的做法。

代码语言:javascript
运行
复制
known_args, unknown_args = secondaryparser.parse_known_args()
value_c = known_args.c 

finalargs = mainparser.parse_known_args(args=unknown_args, namespace=known_args)

使用parse_known_args,我能够提前获取"C“的值。如果您在这里看到第一个代码块,我将返回一个已知和未知的args元组。我使用known_args.c获取"C“的值,并将unknown_Args传递给命名空间为"args”的main_parser。这对我有用。

票数 1
EN

Stack Overflow用户

发布于 2015-08-25 23:00:00

这不是一个确切的答案,但我无法使它适合在一个评论。我不太清楚你想做什么。如果您调用没有参数的parser.parse_args,它将解析命令行。这将导致设置失败,因为参数a和-b对于二级解析器来说是未知的,而参数-c对于主解析器来说是未知的,所以它们不能同时解析相同的命令行。

您不可能运行您向我们展示的代码,因为ArgumentParser没有名为parseArgs和addArgument的方法。(他们是parse_args和add_argument。)

您可以简单地将字符串作为参数传递给ArgumentParser和parse_args来解析字符串,我认为这在您的情况下是可行的,但是很难理解为什么不能使用参数a、-b和-c来创建一个解析器。我想您的实际应用程序肯定比您提供的示例复杂得多。

我不认为您关于弹出堆栈的评论是恰当的,因为您有两个完全不同的解析器,具有不同的堆栈。我认为您可以解析命令行两次,但是由于解析器的定义本质上是相同的,所以它不会完成任何事情(或者至少没有明显的结果)。

我不知道这是否有帮助。如果没有,也许你可以给我们一个更好的想法,你需要做什么。

在复杂的情况下,我总是使用一个名为getArgs say的函数,它根据需要获取所有参数,修改ArgumentParser返回的args对象,并返回它。作为一个简单的例子,假设我有一个名为--区段的字段,用户应该输入一个介于30到100之间的整数,但我希望它是十进制。我的getArgs函数验证输入,然后执行args.extent *= .01,并返回args。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32214295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档