Передача значений по умолчанию в ** kwargs

#python #dictionary #keyword-argument

#python #словарь #ключевое слово-аргумент

Вопрос:

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

 def foo(client):
    """
    API service that returns JSON data and accepts arguments
    """
    report_query = (client.buildQuery()
                        .Select('Date','SearchEngine')
                        .From('Report_10')
                        .During('Yesterday')

    get_report.downloadReport(
            skip_header=True,
            include_names=False,
            get_summary=True,
            get_totals=False)

  

То, что я пытаюсь сделать, это преобразовать эту функцию в ту, которая принимает **kwargs , но имеет аргументы по умолчанию для выбранных полей.

Идея в том, что я мог бы передать аргумент .During() , и если бы я не использовал его по умолчанию Yesterday , я мог бы передавать аргументы .Select() , например .Select() , будет .Select('Date','Device','StrategyType') .

Что я пробовал и пытаюсь понять:

 def fn(**kwargs):
    print(f"""
    ({kwargs['client']}.buildQuery()
     .Select({kwargs['select']}))
     .From({kwargs['report_type']})
     .During({kwargs['during']})

     get_report.downloadReport(
            skip_header={kwargs['skip_header']},
            include_names={kwargs['include_names']},
            get_summary={kwargs['get_summary']},
            get_totals={kwargs['get_totals']})""")
  
 fn(client='10',select=['Date', 'SearchEngine'],report_type='new',during='Yesterday',skip_header=True)
  

ВОЗВРАТ:

  (10.buildQuery()
     .Select(['Date', 'SearchEngine']))
     .From(new)
     .During(Yesterday)

     get_report.downloadReport(
            skip_header=True,
            include_names=False,
            get_summary=True,
            get_totals=False)
  

Где я застрял, я пытаюсь вызвать fn() без каких-либо аргументов ключевого слова и желаю, чтобы функция имела аргументы по умолчанию для каждого поля, чтобы это выглядело как первый фрагмент кода в моем вопросе.

fn()

Ошибка ключа: «клиент»

Возможно ли добиться чего-то подобного?

Ответ №1:

Вы можете использовать оператор распространения в словарях:

 def func(**kwargs):
    kwargs = {"printer": None, **kwargs}
  

Это установит значение printer none, если оно не задано.