Мне бы хотелось, чтобы некоторые параметры CLI можно было повторно использовать между двумя программами, которые используют общий файл библиотеки. В настоящее время каждый файл имеет структуру, подобную следующей:
from .shared import G
@click.command()
@click.option("--thing1", …)
@click.optoin("--thing2", …)
…
def main(**kwargs):
g = G()
g.do_your_thing()
Я хотел бы переместить все это в __init__
из G
или в подкласс G
.
class G:
@click.command()
@click.option("--thing1")
def __init__(**kwargs):
pass
class G6(G):
@click.command()
@click.option("--specific-flag")
def __init__(**kwargs):
super().__init__(**kwargs)
if kwargs.get("--specific-flag"):
do_something()
self.seven = 7
Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:
Usage: something.py [OPTIONS]
Try 'something.py --help' for help.
Error: no such option: --thing1
Моя основная цель с помощью этого рефакторинга состоит в устранении большого количества дублирующего кода, украшающего main
Функция каждой программы путем перемещения общих декораторов в библиотеку.
Если это возможно, возможно ли также использовать опциональный декоратор подкласса для замены того же декоратора в базовом классе? Я предполагаю, что ответ - да.
Редактировать
Основываясь на ответе ниже, моя программа теперь работает со структурой, подобной следующему фрагменту:
_common_options = [
click.option(…), click.option(…), …
]
def common_options(func):
for option in _common_options:
func = option(func)
return func
class G:
def __init__(**kwargs):
print(kwargs)
@click.command()
@common_options
@click.option("--specific-option", …)
def main(**kwargs):
f = G(**kwargs)
Проблема с моей первоначальной попыткой заключалась в том, чтобы поместить все элементы @click.whatever
в качестве декоратора __init__
вместо того, чтобы украшать main
и передать **kwargs
в __init__
.