使用python的点击库时如何摆脱这种TypeError?

时间:2017-04-03 05:02:39

标签: python click command-line-interface

所以我认为使用python click库构建一个简单的命令行工具会非常简单。看来我被困在了一些不跟我点击的东西上。我有以下代码:

import click
import json
import os.path
import sys


@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
@click.argument('title')
@click.argument('category')
@click.argument('tech')
@click.argument('problemNotes')
@click.argument('solutionNotes')


def hello(count, name, title, category, tech, problemNotes, solutionNotes):
    print(tech + problemNotes + solutionNotes)


if __name__ == '__main__':
    hello()

这看起来非常简单。 CL工具应该接受一些选项和参数,然后打印一些。然后,我在终端上键入以下内容以调用该工具:

python bugbook.py --name="steve" "Annoying stack bug" "compile bug" "xcode" "annoying" "get meowed"

但是我收到以下错误:

Traceback (most recent call last):
  File "bugbook.py", line 22, in <module>
    hello()
  File "/Library/Python/2.7/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/Library/Python/2.7/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Library/Python/2.7/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
TypeError: hello() got an unexpected keyword argument 'solutionnotes'

奇怪,我想。看来这个错误是由:

if __name__ == '__main__':
    hello()

实际调用main函数无法传递正确的参数或其他内容,但我尝试过修改并且无法使其正常工作。我错过了什么明显的事情?

1 个答案:

答案 0 :(得分:1)

令牌标准化

版本2.0中的新内容。

从Click 2.0开始,可以提供用于规范化令牌的功能。标记是选项名称,选项值或命令值。例如,这可用于实现不区分大小写的选项。

为了使用此功能,上下文需要传递一个执行令牌规范化的函数。例如,您可以使用一个将令牌转换为小写的函数:

CONTEXT_SETTINGS = dict(token_normalize_func=lambda x: x.lower())

@click.command(context_settings=CONTEXT_SETTINGS)
@click.option('--name', default='Pete')
def cli(name):
    click.echo('Name: %s' % name)

Read more