У меня проблема с доступом к значениям по умолчанию для других входных аргументов из модуля щелчка 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
можно вызвать другим способом, чтобы получить доступ к значениям по умолчанию. В любом случае, это не меняет поведение моей программы, есть она или нет.