python – 在argparse中使用GNU样式的长选项(不会将可选参数与位置混淆)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在argparse中使用GNU样式的长选项(不会将可选参数与位置混淆),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3036字,纯文字阅读大概需要5分钟。
内容图文
例如,使用GNU ls,您可以使用–color [= WHEN]选项控制着色.现在在这种情况下,等号是至关重要的,因为我必须区分–color和位置参数的可选参数(这是要列出的文件).那就是ls –color列出带有颜色的文件,这与ls –color = always相同,但是ls –color总是会列出文件(和颜色).
现在从我看到的argparse似乎接受使用–longopt< argument>的长选项的参数.语法也将导致无法使参数可选.那就是如果我尝试实现与GNU ls具有相同行为的myls(这只是一个例子)我会遇到问题,因为现在myls –color总是意味着与myls相同–color = always(并不是必需的 – 没有参数的颜色,总是作为位置参数).
我知道我可以通过使用myls –color – 来避免这种情况,但是如果没有这种解决方法,有没有办法让这项工作成功?那就是告诉argparse -color的参数必须提供–color [= WHEN]语法.
请注意,我不想依赖于–color选项具有有限数量的有效参数这一事实.以下是我尝试过的无法正常工作的示例:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--foo",
action="store",
nargs="?")
parser.add_argument("frob",
action="store",
nargs=argparse.REMAINDER)
print(parser.parse_args(["alpha", "beta"]))
print(parser.parse_args(["--foo", "alpha", "beta"]))
print(parser.parse_args(["--foo=bar", "alpha", "beta"]))
随着输出:
Namespace(foo=None, frob=['alpha', 'beta'])
Namespace(foo='alpha', frob=['beta'])
Namespace(foo='bar', frob=['alpha', 'beta'])
注意第二个alpha被解释为–foo的参数.我想了:
Namespace(foo=None, frob=['alpha', 'beta'])
Namespace(foo=None, frob=['alpha', 'beta'])
Namespace(foo='bar', frob=['alpha', 'beta'])
解决方法:
你可能已经尝试过了吗?可选后跟所需位置:
p=argparse.ArgumentParser()
p.add_argument('--foo', nargs='?',default='one', const='two')
p.add_argument('bar')
失败了
In [7]: p.parse_args('--foo 1'.split())
usage: ipython3 [-h] [--foo [FOO]] bar
ipython3: error: the following arguments are required: bar
–foo消耗1,没有留下任何酒吧.
http://bugs.python.org/issue9338讨论了这个问题. nargs =’?’即使以下位置需要一个参数,也是贪婪的,消耗一个参数.但建议的补丁很复杂,所以我无法快速将其应用于解析器并测试您的案例.
定义一个可以使用–foo == value但不消耗–foo值中的值的Action的想法很有意思,但我不知道实现它需要什么.当然它不适用于当前的解析器.我必须检查它如何处理显式=.
============================
通过在parse_args中更改深层嵌套函数,
def consume_optional(....):
....
# error if a double-dash option did not use the
# explicit argument
else:
msg = _('ignored explicit argument %r')
#raise ArgumentError(action, msg % explicit_arg)
# change for stack40989413
print('Warn ',msg)
stop = start_index + 1
args = [explicit_arg]
action.nargs=None
action_tuples.append((action, args, option_string))
break
并添加自定义Action类:
class MyAction(myparse._StoreConstAction):
# requies change in consume_optional
def __call__(self, parser, namespace, values, option_string=None):
if values:
setattr(namespace, self.dest, values)
else:
setattr(namespace, self.dest, self.const)
我可以从以下方面获得所需的行为:
p = myparse.ArgumentParser()
p.add_argument('--foo', action=MyAction, const='C', default='D')
p.add_argument('bar')
基本上我正在修改store_const以保存= explicit_arg(如果存在).
我不打算将此作为正式补丁提出,但如果它有用,我会欢迎反馈.使用风险由您自己承担.
内容总结
以上是互联网集市为您收集整理的python – 在argparse中使用GNU样式的长选项(不会将可选参数与位置混淆)全部内容,希望文章能够帮你解决python – 在argparse中使用GNU样式的长选项(不会将可选参数与位置混淆)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。