В моем приложении CLI у меня есть файл конфигурации, содержащий информацию о том, как подключиться к API.Эта конфигурация может быть настроена для нескольких сред: (test / prod / etc).
Я хочу убедиться, что переданная среда существует в файле конфигурации, поэтому я создал декоратор и смоделировал его из confirmation_option
.
ЭтоВот небольшой пример проблемы:
# -*- coding: utf-8 -*-
import sys
import click
TEST_DICT = {
'production': 'ProdKey'
}
def environment_option(*param_decls, **attrs):
"""
Check that the passed environment exists
"""
def decorator(f):
def callback(ctx, param, value):
if not value:
ctx.abort()
try:
TEST_DICT[value]
except KeyError:
click.secho("Bad environment provided: {}".format(value), fg='red')
sys.exit(1)
attrs.setdefault('callback', callback)
return click.option(*(param_decls or ('--environment',)), **attrs)(f)
return decorator
@click.group()
@click.pass_context
def cli(ctx):
"""My CLI"""
@cli.command()
@environment_option('-e', '--environment', help="Environment to associate this key with", required=True)
@click.pass_context
def show_keys(ctx, environment):
"""
List the available keys for the selected environment
"""
click.echo("Environment:", type(environment))
if __name__ == "__main__":
sys.exit(cli()) # pragma: no cover
Если я перешел в недопустимую среду, она работает как положено.
$ python cli show-keys -e notreal
Bad environment provided: notreal
Проблема, с которой я столкнулся, заключается в том, что допустимая среда- тот, который не вызывает ошибку в декораторе - не имеет значения, когда возвращается к функции show_keys
.Это NoneType
:
$ python cli show-keys -e production
Traceback (most recent call last):
File "/home/devuser/.virtualenvs/mycli/bin/mycli", line 11, in <module>
load_entry_point('mycli', 'console_scripts', 'mycli')()
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/devuser/PacketFabric/repositories/mycli/mycli/mycli/commands/config_cmds.py", line 60, in show_keys
click.echo("Environment:", type(environment))
File "/home/devuser/.virtualenvs/mycli/lib/python3.6/site-packages/click/utils.py", line 260, in echo
file.write(message)
AttributeError: type object 'NoneType' has no attribute 'write'
Как мне вернуть значение environment
из этого декоратора вместо NoneType
?