为什么我使用click.argument产生"得到一个意外的关键字参数'帮助'?

Chr*_*tti 18 python python-click

运行以下代码会导致此错误:

TypeError:init()得到一个意外的关键字参数'help'

码:

import click

@click.command()
@click.argument('command', required=1, help="start|stop|restart")
@click.option('--debug/--no-debug', default=False, help="Run in foreground")
def main(command, debug):
    print (command)
    print (debug)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

完整错误输出:

$ python3 foo.py start
Traceback (most recent call last):
  File "foo.py", line 5, in <module>
    @click.option('--debug/--no-debug', default=False, help="Run in foreground")
  File "/home/cbetti/python/lib/python3/dist-packages/click-4.0-py3.4.egg/click/decorators.py", line 148, in decorator
    _param_memo(f, ArgumentClass(param_decls, **attrs))
  File "/home/cbetti/python/lib/python3/dist-packages/click-4.0-py3.4.egg/click/core.py", line 1618, in __init__
    Parameter.__init__(self, param_decls, required=required, **attrs)
TypeError: __init__() got an unexpected keyword argument 'help'
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误?

Chr*_*tti 26

我一次又一次地遇到这种情况,因为跟踪输出与导致错误的参数不对应.请注意ArgumentClass跟踪,这是你的提示.

'help'是一个可接受的参数@click.option.但是,点击库更喜欢您记录自己的参数.该@click.argument help参数导致此异常.

此代码的工作:(注意缺少, help="start|stop|restart"@click.argument)

import click

@click.command()
@click.argument('command', required=1)
@click.option('--debug/--no-debug', default=False, help="Run in foreground")
def main(command, debug):
    """ COMMAND: start|stop|restart """
    print (command)
    print (debug)

if __name__ == '__main__':
        main()
Run Code Online (Sandbox Code Playgroud)

输出:

$ python3 foo.py start
start
False
Run Code Online (Sandbox Code Playgroud)

帮助输出:

Usage: test.py [OPTIONS] COMMAND

  COMMAND: start|stop|restart

Options:
  --debug / --no-debug  Run in foreground
  --help                Show this message and exit.
Run Code Online (Sandbox Code Playgroud)


bar*_*man 5

您将命令定义为参数。请注意,单击比您在此处尝试的方法更好地定义命令。

@click.group()
def main():
    pass

@click.command()
def start():
    print "running command `start`"

@click.command()
def stop():
    print "running command `stop`"

main.add_command(start)
main.add_command(stop)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

将导致以下默认帮助文本:

Usage: test.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  start
  stop
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果您真的需要参数,则不能使用help参数。click 文档确实指出您应该记录您自己的论点。但是,我不知道该怎么做。任何提示?

  • 的确。我还发现文档 [here](http://click.pocoo.org/4/documentation/) 说:`这是遵循 Unix 工具的一般约定,仅将参数用于最必要的事情,并将它们记录在通过按名称引用它们的介绍文本。` (6认同)
  • 您可以使用“@main.command()”而不是“@click.command()”将这些命令添加到“main”作为装饰器。 (2认同)

der*_*don 5

click 库不允许-help在里面添加参数click.arguments(包括当前版本6.7,当此注释被写入时)。但是,您可以使用-help里面的参数click.options您可以在http://click.pocoo.org/6/documentation/
上查看当前的点击文档,或者在http://click.pocoo.org/5/documentation/上查看以前的点击文档,此行为最近没有改变。然后,它是一个WAD。这不是BUG。

  • “WAD”是什么意思? (2认同)
  • “按设计工作”https://www.acronymfinder.com/Works-As-Designed-(WAD).html。通常由软件和硬件制造商用来避免更改特定的产品行为:这意味着产品正在执行预期的操作。 (2认同)