是否有任何方法可以检测是否将选项作为默认值传递



我正在为我的脚本创建一个命令行界面。我希望用户能够在命令行本身或配置文件中提供选项。

某些选项有合理的默认值。我想要的逻辑是:

  • 如果命令行和配置文件中都没有该选项,则使用默认选项。
  • 如果该选项只存在于配置文件或命令行中,则使用该选项。
  • 如果该选项同时存在于配置文件和命令行中,则显式命令行优先。

例如,下面是我的docstring:

"""Usage: my-script.py [options] <some_arg>
Options:
  -c --config=<file>       Configuration file, if it exists. 
                           [default: settings.yaml]
  -d --delay=<delay>       Delay before scraping each message, to avoid rate
                           limiting. Delays by a gaussian distribution with
                           average <delay> and standard deviation <delay>/2.
                           [default: 1]
"""

所以,如果没有settings.yaml,我想要:

$ python my-script.py foo        # delay is "1"
$ python my-script.py -d 5 foo   # delay is "5" 

对于delay: 10settings.yaml,我想要:

$ python my-script.py foo        # delay is "10"
$ python my-script.py -d 5 foo   # delay is "5" 

我遇到的问题是,docopt只是给我一个{"--delay": "1"}{"--delay": "5"}。我无法知道它是否来自违约。此外,我想在文档字符串中指定默认值——从用户的角度来看,这要好得多。

有什么好的、采用python的方法来完成这个任务吗?我想检查解析后的参数与默认参数,但是如果碰巧与参数值匹配,用户将无法用命令行参数覆盖配置文件参数。


我是这样加载配置文件的:

args = docopt(__doc__, version='Yahoo! Groups Backup-er 0.1',
              options_first=True)
cfg_args = {}
if args['--config'] != 'settings.yaml' and not os.path.exists(args['--config']):
    sys.exit("Specified config file '%s' does not exist." % args['--config'])
if os.path.exists(args['--config']):
    settings = yaml.load(open(args['--config']))
    command_line_args = args
    args = {}
    for key, val in settings.items():
        args['--%s' % key] = val
    args.update(command_line_args)

是的,要检查的语法是:

args = docopt(__doc__)
if args["--flag"]:
  print "With --flagn"

相关内容

  • 没有找到相关文章