【问题标题】:Dependent options in docoptdocopt 中的依赖选项
【发布时间】:2019-08-13 07:21:43
【问题描述】:

我想知道我是否可以在 docopt 中有依赖选项。

示例:

"""
Description:
  Flash a system with the manufacturing software from the specifiedx folder.

Usage:
  flash_drop.py (--drop-dir=<DIR>) [--factory-reset=<BOOL>] [--flash-all=<BOOL>] [--flash-system1=<BOOL> | --flash-system2=<BOOL>]
  flash_drop.py -h | --help
  flash_drop.py --version

Options:
  -h --help                 Show this screen.
  --version                 Show version.
  --drop-dir=DIR            Path to the drop directory
  --factory-reset=BOOL          Factory reset the chips on all selected devices. [default: False]
  --flash-all=BOOL              Flash all devices. [default: False]
  --flash-system1=BOOL          Flash first system. [default: False]
  --flash-system2=BOOL          Flash second system. [default: False]
"""

也就是说,如果没有选择前一个选项,则忽略选项的值。例如,--flash-system2 的值将被忽略,除非设置了 --flash-system1

【问题讨论】:

    标签: python docopt


    【解决方案1】:

    如果可以修改代码,您可以通过编程方式忽略它们,例如:

    args['flash-system2'] = args['flash-system2'] if args['flash-system1'] else None
    

    if ('flash-system2' in args) and ('flash-system1' not in args):
        del args['flash-system2']
    

    在解析参数之后

    【讨论】:

    • 我现在正在这样做,但我只是想知道 docopt 是否有这样的功能。
    • 据我所知没有。没有这样的功能。但是,如果我们可以对用户说,如果 flash-system1 没有给出而无需编写,您就不能指定 flash-system2,那就太棒了。
    【解决方案2】:

    不是单一的使用模式,但您可以使用 2 种模式:

    Usage:
      flash_drop.py (--drop-dir=<DIR>) [options] [--flash-system1=<BOOL>]
      flash_drop.py (--drop-dir=<DIR>) [options] --flash-system1=<BOOL> --flash-system2=<BOOL>
    

    但使用三种模式可能更好,更易于阅读 IMO:

    Usage:
      flash_drop.py (--drop-dir=<DIR>) [options]
      flash_drop.py (--drop-dir=<DIR>) [options] --flash-system1=<BOOL>
      flash_drop.py (--drop-dir=<DIR>) [options] --flash-system1=<BOOL> --flash-system2=<BOOL>
      flash_drop.py -h | --help
      flash_drop.py --version
    

    Live demo


    附言

    嗯,你可以技术上,用一个单一的模式来做,但它开始变得很长......

    Usage:
      flash_drop.py (--drop-dir=<DIR>) [options] [(--flash-system1=<BOOL>) | (--flash-system1=<BOOL> --flash-system2=<BOOL>)]
    

    线条可能会被打破,所以也许:

    Usage:
      flash_drop.py (--drop-dir=<DIR>) [options] 
                    [(--flash-system1=<BOOL>) | (--flash-system1=<BOOL> --flash-system2=<BOOL>)]
    

    我个人更喜欢 3 模式解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2021-09-17
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多