#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, если оно не задано.