Как передать переменные другим методам с помощью пакета Python click (Command Line Interface Creation Kit)

Я знаю, что это что-то новое, но мне очень нравится внешний вид click, и я бы хотел его использовать, но я могу не могу понять, как передавать переменные из основного метода в другие методы. Я использую его неправильно, или эта функция просто еще не доступна? Кажется довольно фундаментальным, поэтому я уверен, что это будет там, но это было всего лишь некоторое время так что может и нет.

import click

@click.option('--username', default='', help='Username')
@click.option('--password', default='', help='Password')
@click.group()
def main(**kwargs):
    print("This method has these arguments: " + str(kwargs))


@main.command('do_thingy')
def do_thing(**kwargs):
    print("This method has these arguments: " + str(kwargs))


@main.command('do_y')
def y(**kwargs):
    print("This method has these arguments: " + str(kwargs))


@main.command('do_x')
def x(**kwargs):
    print("This method has these arguments: " + str(kwargs))


main()

Итак, мой вопрос: как мне сделать так, чтобы параметры имени пользователя и пароля были доступны для других методов?


person Darren    schedule 13.05.2014    source источник
comment
Я не могу помочь вам. Просто хочу предложить вам взглянуть на парсер командной строки docopt.   -  person Jan Vlcinsky    schedule 13.05.2014


Ответы (2)


Спасибо @nathj07 за то, что указал мне правильное направление. Вот ответ:

import click


class User(object):
    def __init__(self, username=None, password=None):
        self.username = username
        self.password = password


@click.group()
@click.option('--username', default='Naomi McName', help='Username')
@click.option('--password', default='b3$tP@sswerdEvar', help='Password')
@click.pass_context
def main(ctx, username, password):
    ctx.obj = User(username, password)
    print("This method has these arguments: " + str(username) + ", " + str(password))


@main.command()
@click.pass_obj
def do_thingy(ctx):
    print("This method has these arguments: " + str(ctx.username) + ", " + str(ctx.password))


@main.command()
@click.pass_obj
def do_y(ctx):
    print("This method has these arguments: " + str(ctx.username) + ", " + str(ctx.password))


@main.command()
@click.pass_obj
def do_x(ctx):
    print("This method has these arguments: " + str(ctx.username) + ", " + str(ctx.password))


main()
person Darren    schedule 14.05.2014

Есть ли причина, по которой вы не можете использовать argparse? Я должен думать, что это позволит вам достичь того, что вы ищете, хотя и немного по-другому.

Что касается использования щелчка, то возможно, pass_obj поможет вам

person nathj07    schedule 13.05.2014
comment
@Julius, но у вас есть подразборы, что является еще одним подходом к аналогичной функциональности. - person The_Ham; 09.01.2017