第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 Python click 命令調(diào)用帶有可變參數(shù)的類方法

使用 Python click 命令調(diào)用帶有可變參數(shù)的類方法

瀟湘沐 2021-11-09 16:58:13
我有一個(gè)使用以前未知數(shù)量的參數(shù)初始化的類,我希望它使用 Python 的click包在 CLI 上完成。我的問題是我無法初始化它并運(yùn)行click命令:$ python mycode.py arg1 arg2 ... argN click_command設(shè)置定義數(shù)量的參數(shù),如nargs=5,解決了缺少命令的問題,但我有義務(wù)在我的命令之前輸入 5 個(gè)參數(shù)。對于像nargs=-1, 之類的可變參數(shù),click不能識(shí)別click_command為命令。如何輸入 n 個(gè)參數(shù),然后使用click?import clickclass Foo(object):    def __init__(self, *args):        self.args = args    def log(self):        print('self.args:', self.args)pass_foo = click.make_pass_decorator(Foo)@click.group()@click.argument('myargs', nargs=-1)@click.pass_contextdef main(ctx, myargs):    ctx.obj = Foo(myargs)    print("arguments: ", myargs)@main.command()@pass_foodef log(foo):    foo.log()main()我希望能夠click在將 n-many args 傳遞給我的Foo()類后運(yùn)行命令,因此我可以初始化它并將其log()方法作為 CLI 命令運(yùn)行,但輸出是:錯(cuò)誤:缺少命令
查看完整描述

1 回答

?
一只萌萌小番薯

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊

我不完全確定您正在嘗試做的是解決此問題的最佳方法。我認(rèn)為在命令之后放置可變參數(shù)會(huì)更合乎邏輯,并且肯定會(huì)更符合 click 的工作方式。但是,你可以用這個(gè)做你想做的事情:


自定義類:

class CommandAfterArgs(click.Group):


    def parse_args(self, ctx, args):

        parsed_args = super(CommandAfterArgs, self).parse_args(ctx, args)

        possible_command = ctx.params['myargs'][-1]

        if possible_command in self.commands:

            ctx.protected_args = [possible_command]

            ctx.params['myargs'] = ctx.params['myargs'][:-1]


        elif possible_command in ('-h', '--help'):

            if len(ctx.params['myargs']) > 1 and \

                    ctx.params['myargs'][-2] in self.commands:

                ctx.protected_args = [ctx.params['myargs'][-2]]

                parsed_args = ['--help']

                ctx.params['myargs'] = ctx.params['myargs'][:-2]

                ctx.args = [possible_command]


        return parsed_args

使用自定義類:

然后要使用自定義類,將它作為cls參數(shù)傳遞給組裝飾器,如:


@click.group(cls=CommandAfterArgs)

@click.argument('myargs', nargs=-1)

def main(myargs):

    ...

測試代碼:

import click


class Foo(object):

    def __init__(self, *args):

        self.args = args


    def log(self):

        print('self.args:', self.args)



pass_foo = click.make_pass_decorator(Foo)



@click.group(cls=CommandAfterArgs)

@click.argument('myargs', nargs=-1)

@click.pass_context

def main(ctx, myargs):

    ctx.obj = Foo(*myargs)

    print("arguments: ", myargs)



@main.command()

@pass_foo

def log(foo):

    foo.log()



if __name__ == "__main__":

    commands = (

        'arg1 arg2 log',

        'log --help',

        '--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)

            main(cmd.split())


        except BaseException as exc:

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

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

                raise

結(jié)果:

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)]

-----------

> arg1 arg2 log

arguments:  ('arg1', 'arg2')

self.args: ('arg1', 'arg2')

-----------

> log --help

arguments:  ()

Usage: test.py log [OPTIONS]


Options:

  --help  Show this message and exit.

-----------

> --help

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


Options:

  --help  Show this message and exit.


Commands:

  log


查看完整回答
反對 回復(fù) 2021-11-09
  • 1 回答
  • 0 關(guān)注
  • 307 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)