Python optparse、默认值和显式选项

发布于 2024-12-14 05:54:04 字数 656 浏览 1 评论 0原文

采用以下相当标准的代码:

from optparse import OptionParser                         
opts = OptionParser()
opts.add_option('-f', action="store_true")
opts.add_option("-x", dest="x", type="int", default=1)
options, args = opts.parse_args()

假设 -x-f 是互斥的:当 -x-f 都明确存在,则应报告错误。

如何检测 -x 是否显式存在?即使不是,options 也会列出默认值。

一种方法是避免设置默认值,但我宁愿不这样做,因为 --help 可以很好地打印默认值。

另一种方法是检查 sys.argv 中是否有 -x 的实例,如果 -x 有多个名称,这也有点尴尬> (即 --long-name)并且有不止一对互斥的选项。

有一个优雅的解决方案吗?

Take the following rather standard code:

from optparse import OptionParser                         
opts = OptionParser()
opts.add_option('-f', action="store_true")
opts.add_option("-x", dest="x", type="int", default=1)
options, args = opts.parse_args()

Assume that -x and -f are mutually exclusive: when -x and -f are both explicitly present, an error should be reported.

How do I detect if -x is present explicitly? Even if it is not, options list the default value.

One way would be to avoid setting the default value which I rather won't do because --help prints default values nicely.

Another way would be checking sys.argv for instances of -x which is a bit awkward, too, if there's more than one name for -x (that is, a --long-name) and there's more than one pair of mutually exclusive options.

It there an elegant solution for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寄风 2024-12-21 05:54:04

您可以使用回调通过 optparse 来完成此操作。从您的代码构建:

from optparse import OptionParser

def set_x(option, opt, value, parser):
    parser.values.x = value
    parser.values.x_set_explicitly = True

opts = OptionParser()
opts.add_option('-f', action="store_true")
opts.add_option("-x", dest="x", type="int", default=1, action='callback',
                callback=set_x)
options, args = opts.parse_args()
opts.values.ensure_value('x_set_explicitly', False)

if options.x_set_explicitly and options.f:
    opts.error('options -x and -f are mutually exclusive')

现在我们将此脚本称为 op.py。如果我执行 python op.py -x 1 -f ,响应是:

用法:op.py [选项]

op.py:错误:选项 -x 和 -f 是互斥的

You can accomplish this with optparse using a callback. Building from your code:

from optparse import OptionParser

def set_x(option, opt, value, parser):
    parser.values.x = value
    parser.values.x_set_explicitly = True

opts = OptionParser()
opts.add_option('-f', action="store_true")
opts.add_option("-x", dest="x", type="int", default=1, action='callback',
                callback=set_x)
options, args = opts.parse_args()
opts.values.ensure_value('x_set_explicitly', False)

if options.x_set_explicitly and options.f:
    opts.error('options -x and -f are mutually exclusive')

Let's call this script op.py for now. If I do python op.py -x 1 -f, the response is:

Usage: op.py [options]

op.py: error: options -x and -f are mutually exclusive

呆橘 2024-12-21 05:54:04

使用 argparse。有一个互斥组部分:

argparse.add_mutually_exclusive_group(required=False)

创建一个互斥组。 argparse 将确保互斥组中仅存在一个参数
在命令行上:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args(['--foo'])
Namespace(bar=True, foo=True)
>>> parser.parse_args(['--bar'])
Namespace(bar=False, foo=False)
>>> parser.parse_args(['--foo', '--bar'])
usage: PROG [-h] [--foo | --bar]
PROG: error: argument --bar: not allowed with argument --foo

optparse 无论如何已被弃用。

Use argparse. There's a section for mutually exclusive groups:

argparse.add_mutually_exclusive_group(required=False)

Create a mutually exclusive group. argparse will make sure that only one of the arguments in the mutually exclusive group was present
on the command line:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args(['--foo'])
Namespace(bar=True, foo=True)
>>> parser.parse_args(['--bar'])
Namespace(bar=False, foo=False)
>>> parser.parse_args(['--foo', '--bar'])
usage: PROG [-h] [--foo | --bar]
PROG: error: argument --bar: not allowed with argument --foo

optparse is deprecated anyway.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文