Python Click - Получить другие аргументы во время обратного вызова. - PullRequest
0 голосов
/ 11 марта 2020

У меня проблема с доступом к значениям по умолчанию для других входных аргументов из модуля щелчка Python ( Версия 6.7 , работающая на Python 3.6 ) во время обратный вызов по определенному параметру. Целью моего обратного вызова было бы проанализировать набор чисел на основе всех других входных данных и вернуть их в качестве входного аргумента функции. Однако, в зависимости от того, как вещи вызываются из командной строки, контекст щелчка не может получить доступ к аргументам по умолчанию или даже к некоторым входам командной строки, в зависимости от порядка их использования. Теперь, решение этой проблемы может заключаться в обработке этого анализа внутри функции, но я чувствую, что это возможно сделать в обратном вызове, поэтому я хотел бы попытаться заставить его работать, если это возможно.

Рассмотрим следующий минимальный пример:

import click


def check_number(ctx, _, input_):

    """Do some calculations to check the number"""

    p = ctx.params

    # Print defaults as I see them here.
    print('User:', p.get('user', None))
    print('Start Date:', p.get('start_date', None))
    print('End Date:', p.get('end_date', None))
    print('Number:', input_)

    # Number is typically a range of numbers that needs to be parsed.
    # Here I would revise the input and return whats left after my check
    return input_


@click.command()
@click.option('--user','user', default='Default User')
@click.option('--start','start_date', default='2000_0101')
@click.option('--end','end_date',default='2020_0101')
@click.option('--number','number', default=0, callback=check_number)
def main(user, start_date, end_date, number):

    """Do some stuff."""


if __name__ == '__main__':

    main()

Запуск сценария без вызова каких-либо параметров возвращает значения по умолчанию, как и ожидалось.

> ./click_context_problem.py
User: Default User
Start Date: 2000_0101
End Date: 2020_0101
Number: 0

Однако, если я начну добавлять входные аргументы, он становится неспособным восстановить значения по умолчанию. Например:

> ./click_context_problem.py --number=1
User: None
Start Date: None
End Date: None
Number: 1

Теперь, я могу видеть некоторые входные данные, если я добавлю их в командную строку, но только если это будет перед опцией --number, как показано ниже:

> ./click_context_problem.py --user=me --number=1
User: me
Start Date: None
End Date: None
Number: 1

> ./click_context_problem.py --number=1 --user=me
User: None
Start Date: None
End Date: None
Number: 1

Я где-то видел предложенное решение (которое, к сожалению, больше не могу найти), в котором предлагалось создать подкласс click.Command, который выглядит следующим образом:

class GatherOptions(click.Command):

    """This class makes sure all of the input arguments are gathered and passed through the context for the option callbacks."""

    def make_context(self, *args, **kwargs):
        ctx = super(GatherOptions, self).make_context(*args, *kwargs)
        return ctx

...

@click.command(cls=GatherOptions)  # Add this class here

Однако я не я действительно не вижу, что это делает, так как вызов суперкласса никак не изменяется. Но, возможно, метод make_context можно вызвать другим способом, чтобы получить доступ к значениям по умолчанию. В любом случае, это не меняет поведение моей программы, есть она или нет.

...