亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 單擊命令的功能標志

Python 單擊命令的功能標志

慕勒3428872 2021-12-17 16:39:18
在我的 python-click-CLI 腳本中,我正在為用戶不應該看到的功能構建一些命令(不要混淆他們),但對于例如開發人員是可見的。是否可以將功能標志用于 Python 單擊命令?如果命令可用或不可用,我希望能夠配置(通過配置文件等)。如果禁用了命令功能,則該命令不應是可調用的,并且幫助不應顯示它。像這樣:FLAG_ENABLED = False# This command should not be shown and not be callable as long as the flag is [email protected](name='specialfeature', active=FLAG_ENABLED)def special_feature_command()    ....顯然,我可以改變我的函數體:@cli.command(name='specialfeature', active=FLAG_ENABLED)def special_feature_command()    if FLAG_ENABLED:        ...    else:        ...但是我的命令仍然會出現在幫助中,我想避免這種情況。
查看完整描述

1 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

您可以使用自定義類添加功能標志功能,例如:


自定義類

這個類覆蓋了click.Group.command()用于裝飾命令函數的方法。它添加了傳遞active標志的能力,該標志何時False將跳過將命令添加到組中。


import click


class FeatureFlagCommand(click.Group):


    def command(self, *args, active=True, **kwargs):

        """Behaves the same as `click.Group.command()` except added an

        `active` flag which can be used to disable to command.

        """

        if active:

            return super(FeatureFlagCommand, self).command(*args, **kwargs)

        else:

            return lambda f: f

使用自定義類

通過將cls參數傳遞給click.group()裝飾器,任何通過 the 添加到組中的命令group.command()都將使用該active標志進行門控。


@click.group(cls=FeatureFlagCommand)

def cli():

    ...


@cli.command(name='specialfeature', active=FLAG_ENABLED)

def special_feature_command()

    ...

這是如何運作的?

這是有效的,因為 click 是一個設計良好的 OO 框架。很容易繼承click.Group和構建一個新的command()裝飾器。在新的command()裝飾器中,如果活動標志是False我們返回未裝飾的函數而不是將函數添加到組中。


測試代碼:

@click.group(cls=FeatureFlagCommand)

def cli():

    """My Awesome Click Program"""


@cli.command(active=False)

def command1():

    click.echo('Command 1')


@cli.command(active=True)

def command2():

    click.echo('Command 2')


@cli.command()

def command3():

    click.echo('Command 3')



if __name__ == "__main__":

    commands = (

        'command1',

        'command2',

        'command3',

        '--help',

        '',

    )


    import sys, time


    time.sleep(1)

    print('Click Version: {}'.format(click.__version__))

    print('Python Version: {}'.format(sys.version))

    for cmd in commands:

        try:

            time.sleep(0.1)

            print('-----------')

            print('> ' + cmd)

            time.sleep(0.1)

            cli(cmd.split())


        except BaseException as exc:

            if str(exc) != '0' and \

                    not isinstance(exc, (click.ClickException, SystemExit)):

                raise

結果:

Click Version: 6.7

Python Version: 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]

-----------

> command1

Usage: test.py [OPTIONS] COMMAND [ARGS]...


Error: No such command "command1".

-----------

> command2

Command 2

-----------

> command3

Command 3

-----------

> --help

Usage: test.py [OPTIONS] COMMAND [ARGS]...


  My Awesome Click Program


Options:

  --help  Show this message and exit.


Commands:

  command2

  command3

-----------

Usage: test.py [OPTIONS] COMMAND [ARGS]...


  My Awesome Click Program


Options:

  --help  Show this message and exit.


Commands:

  command2

  command3


查看完整回答
反對 回復 2021-12-17
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號