【问题标题】:Is there any way to detect whether an option was passed as a default?有什么方法可以检测选项是否作为默认值传递?
【发布时间】:2019-10-08 08:36:59
【问题描述】:

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

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

  • 如果该选项既不在命令行也不在配置文件中,请使用默认值。
  • 如果该选项仅在配置文件中,或者仅在命令行中,请使用该选项。
  • 如果选项在配置文件命令行中,显式命令行优先。

例如,这是我的文档字符串:

"""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" 

我想要一个settings.yamldelay: 10

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

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

有没有什么好的docopt-y,Pythonic方式来完成这个?我正在考虑根据默认参数检查解析的参数,但是如果它恰好与参数值匹配,用户将无法使用命令行参数覆盖配置文件参数。


这是我加载配置文件的方式:

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)

【问题讨论】:

  • 您是自己加载配置文件,还是 docopt 以某种方式为您处理?
  • @JohnZwinck:我自己加载。
  • 向我们展示您是如何加载它的。我的意思是代码。
  • @JohnZwinck:抱歉,刚刚用它实际使用的代码更新了它
  • 使用argparse(是的,我知道这是一个docopt 问题)了解用户是否指定值的最可靠方法是将默认值保留为None,并使用解析后的if args.delay is None: 测试。无法在命令行中指定None(普通类型)。

标签: python docopt


【解决方案1】:

是的,要检查的语法是:

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

详情请阅读this文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多