将默认值传递给** kwargs

问题描述

我有一个返回一些数据的函数,为了获取数据,我需要做的是将类似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,get_totals=False) ,并希望该函数在每个字段中都具有认参数,以使其看起来像我问题中的第一个代码段。

fn()

KeyError:“客户端”

有可能实现这样的目标吗?

解决方法

您可以在字典上使用传播运算符:

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

如果未提供值printer,则将其设置为无。