クリックコマンドをサブコマンドのセットごとに複数のファイルに分割するにはどうすればよいでしょうか? 質問する

クリックコマンドをサブコマンドのセットごとに複数のファイルに分割するにはどうすればよいでしょうか? 質問する

大規模なクリック アプリケーションを 1 つ開発しましたが、さまざまなコマンド/サブコマンド間の移動が困難になっています。コマンドを別々のファイルに整理するにはどうすればよいでしょうか。コマンドとそのサブコマンドを別々のクラスに整理することは可能ですか。

これをどのように分離するかの例を次に示します。

初期化

import click

@click.group()
@click.version_option()
def cli():
    pass #Entry Point

コマンド_cloudflare.py

@cli.group()
@click.pass_context
def cloudflare(ctx):
    pass

@cloudflare.group('zone')
def cloudflare_zone():
    pass

@cloudflare_zone.command('add')
@click.option('--jumpstart', '-j', default=True)
@click.option('--organization', '-o', default='')
@click.argument('url')
@click.pass_obj
@__cf_error_handler
def cloudflare_zone_add(ctx, url, jumpstart, organization):
    pass

@cloudflare.group('record')
def cloudflare_record():
    pass

@cloudflare_record.command('add')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_add(ctx, domain, name, type, content, ttl):
    pass

@cloudflare_record.command('edit')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_edit(ctx, domain):
    pass

コマンド_uptimerobot.py

@cli.group()
@click.pass_context
def uptimerobot(ctx):
    pass

@uptimerobot.command('add')
@click.option('--alert', '-a', default=True)
@click.argument('name')
@click.argument('url')
@click.pass_obj
def uptimerobot_add(ctx, name, url, alert):
    pass

@uptimerobot.command('delete')
@click.argument('names', nargs=-1, required=True)
@click.pass_obj
def uptimerobot_delete(ctx, names):
    pass

ベストアンサー1

これを使用する場合の欠点はCommandCollection、コマンドが結合され、コマンド グループでのみ機能することです。私見では、add_command同じ結果を得るには を使用する方がよい代替手段です。

次のツリーを持つプロジェクトがあります:

cli/
├── __init__.py
├── cli.py
├── group1
│   ├── __init__.py
│   ├── commands.py
└── group2
    ├── __init__.py
    └── commands.py

各サブコマンドには独自のモジュールがあり、これにより、多数のヘルパー クラスやファイルを含む複雑な実装でも非常に簡単に管理できます。各モジュールのファイルには注釈commands.pyが含まれています@click。例group2/commands.py:

import click


@click.command()
def version():
    """Display the current version."""
    click.echo(_read_version())

必要に応じて、モジュール内にさらにクラスを簡単に作成し、importここで使用して、CLI に Python のクラスとモジュールの全機能を提供できます。

Mycli.pyは CLI 全体のエントリ ポイントです。

import click

from .group1 import commands as group1
from .group2 import commands as group2

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

entry_point.add_command(group1.command_group)
entry_point.add_command(group2.version)

この設定により、コマンドを懸念事項ごとに分離し、必要に応じてコマンドの周囲に追加機能を構築することが非常に簡単になります。これまでのところ、非常に役立っています...

参照:http://click.pocoo.org/6/quickstart/#ネスティングコマンド

おすすめ記事