如何知道optparse选项是在命令行中传递还是作为默认值传递

use*_*454 8 python optparse

使用python optparse.py,有没有办法计算出是从命令行还是从默认值设置了特定的选项值.

理想情况下,我希望像默认值一样使用dict,但包含实际从命令行提供的选项

我知道您可以将每个选项的值与默认值进行比较,但这不能区分通过与默认值匹配的命令行传递的值.

谢谢!


编辑

对不起我原来的措辞不是很清楚.

我有大量的脚本从批处理文件中调用.出于审计目的,我想报告正在传递的选项,以及它们是从命令行,默认还是其他方式传递到日志文件.

使用默认值可以判断选项是否与默认值匹配,但仍然不能告诉您它是否实际上是从命令行提供的.这可能是相关的:如果从命令行传递一个选项并且与默认值一致,那么如果然后更改代码中的默认值,脚本仍将获得相同的值.

对我来说,拥有一个等效的默认值是很自然的,包含实际提供的值.

为了使问题具体,在这个例子中:

>>> sys.argv = ['myscript.py','-a','xxx']
>>> import optparse
>>> parser = optparse.OptionParser()
>>> parser.add_option('-a', default = 'xxx')
>>> parser.add_option('-b', default = 'yyy')
Run Code Online (Sandbox Code Playgroud)

我如何知道从命令行传递的选项a.是手动解析命令行的唯一方法吗?

(我知道这是一个相当小的一点,但我认为如果我在optparse上遗漏了什么,那将是值得的)

再次感谢

Bru*_*nzi 8

而不是下面的样板代码:

opts, args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

如果您使用以下代码,您将拥有一个附加值对象opts_no_defaults,其中包含用户明确指定的选项:

opts_no_defaults = optparse.Values()
__, args = parser.parse_args(values=opts_no_defaults)
opts = Values(parser.get_default_values().__dict__)
opts._update_careful(opts_no_defaults.__dict__)
Run Code Online (Sandbox Code Playgroud)

最后,opts应与初始样板代码中的相同.

print opts_no_defaults.__dict__
print opts.__dict__
for opt in parser._get_all_options():
    if opt.dest:
        print "Value of %s: %s" % (opt._long_opts[0], getattr(opts, opt.dest))
        print "Is %s specified by user? %s" % (opt._long_opts[0], hasattr(opt_no_defaults, opt.dest))
Run Code Online (Sandbox Code Playgroud)


mg.*_*mg. 3

不了解你的代码不可能给出更好的答案,但是......

  1. 只是不将默认值传递给解析器并检查None值。值None是 lib 的默认值optparse,因此您可以检索自己的默认值并像往常一样操作;

  2. 延伸optparse到专门化它。

我不知道你的程序,但当配置相同时,通常这不是一个好的设计改变行为。