【问题标题】:Python Click command doesn't recognize optionsPython Click 命令无法识别选项
【发布时间】:2017-06-27 09:09:52
【问题描述】:

我正在尝试在 Click 中注册命令行选项。在我将 params 参数添加到构造函数之前,一切正常。

class InitCommand(click.Command):
    def __init__(self):
        super().__init__(
            name='init',
            short_help='Initialize the needed scaffolding.',
            help='something helpful, but longer',
            # params=[]    ### <-- Works fine
            params=[click.Option('--force', default=False)]
        )

我收到以下错误:

Traceback (most recent call last):
  File "/usr/local/bin/aquapy", line 11, in <module>
    load_entry_point('aquapy-cli', 'console_scripts', 'aquapy')()
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 561, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2291, in load
    return self.resolve()
  File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2297, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/Users/******/__main__.py", line 3, in <module>
    from .bootstrap import main
  File "/Users/******/bootstrap.py", line 17, in <module>
    main.add_command(InitCommand())
  File "/Users/******/commands/init_command.py", line 10, in __init__
    params=[click.Option('--force', default=False)]
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1460, in __init__
    Parameter.__init__(self, param_decls, type=type, **attrs)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1266, in __init__
    self._parse_decls(param_decls or (), expose_value)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1533, in _parse_decls
    raise TypeError('Name defined twice')
TypeError: Name defined twice

【问题讨论】:

  • 您在__init__() 中忘记了括号。另外,请提供完整的 Traceback。谢谢:)。
  • 不,我没有...??
  • MCVE 和用例说明如何?您在此处用于初始化此类的模式与通常使用单击类的方式完全不同
  • @VaibhavBajaj 关闭 ) 在底部。 super() 下的整个部分是构造函数的参数。

标签: python python-3.x python-click


【解决方案1】:

问题在于click.Option() 期望列表的第一个参数,并且不像装饰器版本@click.option()

params=[click.Option(['--force'], default=False)]

将命令选项包装在列表中解决了这个问题。

【讨论】:

  • 我认为它也会像装饰器一样工作,甚至没有考虑检查 Click 文档中的方法签名。谢谢!